hql加强使用

  1. BaseDAO

    通过书籍名字模糊查询数据,并且具备分页的功能
    代码:

package com.zking.util;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.query.Query;

public class BaseDao {

/**
 * 赋值
 * @param query
 * @param map
 */
public void setParameter(Query query,Map<String,Object> map) {
	if(map==null ||map.size()==0) {
		return;
	}
	Object value=null;
	for (Map.Entry<String,Object> entry : map.entrySet()) {
		value=entry.getValue();
		if(value instanceof Collection) {
			query.setParameterList(entry.getKey(),(Collection) value);
		}
		else if(value instanceof Object[]) {
			query.setParameterList(entry.getKey(),(Object[]) value);
		}
		else {
			query.setParameter(entry.getKey(), value);
		}
	}
}

/**
 * 关于hql语句的处理
 * @param hql
 * @return
 */
private String getCountHql(String hql) {
	int  index=hql.toUpperCase().indexOf("FROM");
	return "select count(*)"+hql.substring(index);
}

/**
 * 
 * @param hql
 * @param pageBean
 * @param map
 * @param session
 * @return
 */
public List executeQuery(String hql,PageBean pageBean,Map<String,Object> map,Session session) {
	if(pageBean!=null&&pageBean.isPagination()) {
		String countHql=getCountHql(hql);
		Query counquery=session.createQuery(countHql);
		this.setParameter(counquery, map);
     	String total=counquery.getSingleResult().toString();
		pageBean.setTotal(total);
		
		Query pageQuery=session.createQuery(hql);
		this.setParameter(pageQuery, map);
		pageQuery.setFirstResult(pageBean.getStartIndex());
		pageQuery.setMaxResults(pageBean.getRows());
		return pageQuery.list();
	}
	else {
		Query query=session.createQuery(hql);
		this.setParameter(query, map);
		return query.list();
				
	}
	
	
}

}

  1. 原生sql
    hql实现不了的功能,可以考虑使用原生sql

@Test
public void testList() {
String hql=“select * from t_hibernate_book”;
query = session.createSQLQuery(hql);
List<Object[]> list = query.list();
for (Object[] b : list) {
System.out.println(Arrays.toString(b));
}
}
原生sql:

SQLQuery sqlQ = session.createSQLQuery("select tname,tage from teacher ");
	//指定查询出来的列的名称和类别
	sqlQ.addScalar("tname", Hibernate.STRING);
	sqlQ.addScalar("tage", Hibernate.INTEGER);

//有条件的
SQLQuery sqlQ = session.createSQLQuery("select * from teacher where tname like :tname and tage > :tage");
	
	Teacher t = new Teacher();
	t.setTage(26L);
	t.setTname("%王%");
	
	sqlQ.addEntity("t",Teacher.class);
	
	sqlQ.setProperties(t);

//统计 分组
SQLQuery sqlQ=session.createSQLQuery("select s.sclass,count(*) c from students s group by s.sclass order by c desc");
	sqlQ.addScalar("sclass", Hibernate.STRING);
	sqlQ.addScalar("c", Hibernate.INTEGER);

//连接查询 (没有fetch,只有在hql中才有)

// SQLQuery sqlQ=session.createSQLQuery(“select s.,t. from students s left join tAndS ts on s.sid=ts.studentId left join teachers t on ts.teacherId=t.tid where t.tname like ?”);
// sqlQ.addEntity(“s”,Student.class);
// sqlQ.addEntity(“t”,Teacher.class);
// sqlQ.setString(0, “%李四%”);

分页
//原生sql方式 其他方式也差不多
int pageRow=2;//每页显示多少行
int currPage=2;//当前页

	SQLQuery sqlQ=session.createSQLQuery("select t.* from teachers t");
	sqlQ.addEntity("t",Teacher.class);
	sqlQ.setFirstResult((currPage-1)*pageRow);
	sqlQ.setMaxResults(pageRow);
	
	List<Teacher> ts=sqlQ.list();
	for(Teacher t : ts){
		System.out.println(t.getTname());		}

Hibernate SQLQuery 查询char类型结果为一个字符解决方法
在使用Hibernate的原生态SQL对Oracle进行查询时,碰到查询char类型的时候始终返回的是一个字符,开始认为应该是Hibernate在做映射的把数据类型给映射成char(1),在经过查找网上的一些资料,得知产生这个问题的主要原因确实是Hibernate再查询Oracle的时候,将char自动映射成character(varchar的子集)类型,现有以下几种解决方法:

1:将你要查询的实体转换成实体Bean,使用HQL查询,这样就不存在字段映射的问题了,但是这样比较麻烦;

2:可以使用Hibernate中的addScalar(String arg,Type type)来自定义返回字段的类型,如:
this.getSession()
.createSQLQuery(“select id,name,state from tb”)
.addScalar(“id”, Hibernate.STRING)
.addScalar(“name”, Hibernate.STRING)
.addScalar(“state”, Hibernate.STRING)
.list();
这样就可以解决,但是这样的话,必须把所有要查询的字段进行定义,在字段比较多的时候,就相对比较麻烦;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值