现在的位置: 首页 > 综合 > 正文

session.createQuery()与createSQLQuery()区别

2017年12月27日 ⁄ 综合 ⁄ 共 3099字 ⁄ 字号 评论关闭

---session.createQuery()与createSQLQuery()区别

链接:http://www.cnblogs.com/Earl/archive/2010/11/01/1866241.html
链接:http://www.blogjava.net/rain1102/archive/2009/02/23/256344.html

1.createQuery(hql): 用的hql语句进行查询,以hibernate生成的Bean为对象装入list返回

	Query query = getSession().createQuery(hql);

2.createSQLQuery(sql): 用sql语句查询,以对象数组进行存储

	Query query = getSession().createSQLQuery(sql);
	query.setFirstResult((page - 1) * pageSize); //使当前记录滚动到指定记录
	query.setMaxResults(pageSize);
	for (int i = 0; i < paramNames.length; i++) {
		query.setParameter(paramNames[i], paramValues[i], paramTypes[i]);
	}
	List list = query.list();

3.使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回:addEntity

	Query query = getSession().createSQLQuery(sql).addEntity(returnAlias, returnClass);		
	List list = query.list();

---createSQLQuery()

连接:http://blog.csdn.net/liujinwei2005/article/details/7982721

http://blog.csdn.net/gs313874233/article/details/7480224

http://langgufu.iteye.com/blog/1565397 addJoin

Hibernate除了支持HQL查询外,还支持原生SQL查询。
对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。该接口是Query接口的子接口。
执行SQL查询步骤如下:
1、获取Hibernate Session对象
2、编写SQL语句
3、通过Session的createSQLQuery方法创建查询对象
4、调用SQLQuery对象的addScalar()或addEntity()方法将选出的结果与标量值或实体进行关联,分别用于进行标量查询或实体查询
5、如果SQL语句包含参数,调用Query的setXxxx方法为参数赋值
6、调用Query的list方法返回查询的结果集

一、标量查询
session.createSQLQuery("select * from person_inf").list();  

它们都将返回一个Object数组组成的List,数组每个元素都是person_inf表的一个字段值。Hibernate会使用ResultSetMetadata来判定返回的标量值的实际顺序和类型。
但是在JDBC中过多的使用ResultSetMetadata会降低程序的性能。所以为了过多的避免使用ResultSetMetadata或者为了指定更加明确的返回值类型,我们可以使用addScalar()方法:


session.createSQLQuery("select * from person_inf")   
.addScalar("name",StandardBasicTypes.STRING)   
.addScalar("age",StandardBasicTypes.INT)    
.list();  

二、实体查询
addEntity()方法可以将查询结果转换为实体。
1、查询返回的是某个数据表的全部数据列
2、该数据表有对应的持久化类映射
session.createSQLQuery("select * from perons_inf").addEntity(Person.class).list;  


上面的都是单表查询,如果我们在SQL语句中使用了多表连接,则SQL语句可以选出多个数据表的数据。Hibernate支持将查询结果转换成多个实体。如果要将查询结果转换成多个实体,则SQL字符串中应该为不同数据表指定不同别名,并且调用addEntity()方法将不同数据表转换成不同实体。

String sql = "select p.*,e.* from person_inf as p inner join event_inf as e on p.person_id=e.person_id";  
List list = session.createSQLQuery(sql).addEntity("p",Person.class).addEntity("e", MyEvent.class).list();  


List cats = sess.createSQLQuery( " select {cat.*} from cats cat " ).addEntity( " cat " , Cat. class ).list();


--------------
http://www.blogjava.net/rain1102/archive/2009/02/23/256344.html //setResultTransformer

http://lilerwei.iteye.com/blog/974917 //setResultTransformer
http://lisong0624.blog.163.com/blog/static/18871986201152094422549/

//返回一个map,KEY:为DB中名称一致(大小写一致)
对于setResultTransformer的用法还有很多,它可以将用SQL语句查询的结果转化成为指定的BEAN,也可以转为LIST,也可以转化为MAP
List<Map<String, Object>> list = session.createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();


Query query = session.createSQLQuery(sql).setResultTransformer(Transformers.TO_LIST);


Query query = session.createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(SysLog.class));


-------
public SQLQuery addJoin(String alias, String path)  //Declare a "joined" entity


List<Object[]> l = session.createSQLQuery( "select * from employee e,department d where e.id = d.id").addEntity("employee", Employee.class).addJoin("department","employee.dept").list();

抱歉!评论已关闭.