1:HQL查询特性
* 支持设定各种查询条件
* 支持分页查询
* 支持连接查询
* 支持分组查询,如group by, having等关键字
*支持聚集函数,如count()、sum()、max()等
*支持调用用户自动义SQL函数
*支持子查询
*支持动态绑定查询参数
*支持投影查询,通过检索对象的部分属性来提高查询性能
2: HQL查询例句
* from Company
* select c from Company as c
* List result = session.find("from Company");
* Query q = session.createQuery("from Company");
List result = query.list();
* Query q = session.createQuery("from Company where name=?");
q.setParameter(0, "alibaba");
List result = q.list();
//默认情况下,如果不指定传入参数的类型,Hibernate会通过反射机制动态的获得属性参数的类型,也可以通过下面的方式显示的
//指定参数类型
q.setParameter(0, "alibaba", Hibernate.STRING);
*命名参数赋值
Query q = session.createQuery("from Company where name= :name and creationDate <: creationDate");
q.setParameter("creationDate ", new Date());
q.setParameter("name", "alibaba");
List result = q.list();
*为了实现HQL语句的统一管理,HIbernate提供了命名查询(Named Query)的方式,也就是将HQL放到相应的类映射文件中,例如:
<query name="Company.byName">
<![CDATA[from Company where name= :name]]>
</query>
在程序中应用:
Query query = session.getNamedQuery("Company.byName");
q.setParameter("name", "alibaba");
List list = q.list();
通过上面的介绍,应该对HQL有了一些基本的了解,当调用Session接口或者Query接口执行HQL查询时,Hibernate会完成以下工作:
* Hibernate在Query调用list或者iterator等接口时,通过相应的Dialect方言提供的不同数据库特性将HQL语句编译为SQL语句
* 创建JDBC的PreparedStatement实例,并根据参数类型传入对应的查询参数
* 执行PreparedStament,将得到的ResultSet映射为对应的持久对象,根据不同的映射定义,持久对象的抓取程度会有所不同