Hibernate之HQL
HQL介绍
Hibernate中不使用SQL而是有自己的面向对象查询语言,该语言名为Hibernate查询语言(Hibernate Query Language).HQL被有意设计成类似SQL,这样开发人员可以利用已有的SQL知识,降低学习坡度.它支持常用的SQL特性,这些特性被封装成面向对象的查询语言,从某种意义上来说,由HQL是面向对象的,因此比SQL更容易编写.本文将逐渐介绍HQL的特性.
查询数据库中所有实例
要得到数据库中所有实例,HQL写为”from 对象名”即可,不需要select子句,当然更不需要Where子句.代码如右.
Query query=session.createQuery("from User"); List<User> users=(List<User>)query.list();
for(User user:users){
System.out.println(user);
}限制返回的实例数
设置查询的maxResults属性可限制返回的实例(记录)数,代码如右:
Query query=session.createQuery("from User order by name");
query.setMaxResults(5);
List<User> users=(List<User>)query.list();System.out.println("返回的User实例数为"+users.size());
for(Useruser:users){
System.out.println(user);
}分页查询
分页是Web开发的常见课题,每种数据库都有自己特定的分页方案,从简单到复杂都有.在Hibernate中分页问题可以通过设置firstResult和maxResult轻松的解决.
代码如右:
Query query=session.createQuery("from User order by name");
query.setFirstResult(3);
query.setMaxResults(5);
List<User> users=(List<User>)query.list();System.out.println("返回的User实例数为"+users.size());
for(Useruser:users){
System.out.println(user);
}条件查询
条件查询只要增加Where条件即可.代码如右:
Hibernate中条件查询的实现方式有多种,这种方式的优点在于能显示完整的SQL语句(包括参数)如下.
select
user0_.IDasID0_,
user0_.nameasname0_,
user0_.pswdaspswd0_,
user0_.emailasemail0_,
user0_.lastLoginTimeaslastLogi5_0_,
user0_.lastLoginIpaslastLogi6_0_
from
USERTABLE_OKBuser0_
where
user0_.name like '何%'public static void fetchByName(String prefix){
Sessionsession=HibernateUtil.getSession();
Queryquery=session.createQuery("fromUserwherenamelike'"+prefix+"%'");
List<User>users=(List<User>)query.list();
System.out.println("返回的User实例数为"+users.size());
for(Useruser:users){
System.out.println(user);
}
HibernateUtil.closeSession(session);
}位置参数条件查询
HQL中也可以象jdbc中PreparedStatement一样为SQL设定参数,但不同的是下标从0开始.代码如右:
publicstaticvoidfetchByPos(Stringprefix){
Sessionsession=HibernateUtil.getSession();
Queryquery=session.createQuery("fromUserwherename=?");
//注意下标是从0开始,和jdbc中PreparedStatement从1开始不同
query.setParameter(0,prefix);
List<User>users=(List<User>)query.list();
System.out.println("返回的User实例数为"+users.size());
for(Useruser:users){
System.out.println(user);
}
HibernateUtil.closeSession(session);
}命名参数条件查询
使用位置参数条件查询最大的不便在于下标与?号位置的对应上,如果参数较多容易导致错误.这时采用命名参数条件查询更好.使用命名参数时无需知道每个参数的索引位置,这样就可以节省填充查询参数的时间.
如果有一个命名参数出现多次,那在每个地方都会设置它.
public static void fetchByNamedParam(){
Sessionsession=HibernateUtil.getSession();
Queryquery=session.createQuery("fromUserwherename=:name");
query.setParameter("name","李白");
List<User>users=(List<User>)query.list();
System.out.println("返回的User实例数为"+users.size());
for(Useruser:users){
System.out.println(user);
}
HibernateUtil.closeSession(session);
}命名查询
命名查询是嵌在XML映射文件中的查询。通常,将给定对象的所有查询都放在同一文件中,这种方式可使维护相对容易些。命名查询语句写在映射定义文件的最后面。
执行代码如下:Session session=HibernateUtil.getSession();
Query query=session.getNamedQuery("user.sql");List<User> users=(List<User>)query.list();
System.out.println("返回的User实例数为"+users.size());
for(Useruser:users){
System.out.println(user);
}
HibernateUtil.closeSession(session);映射文件节选:
<hibernate-mappingpackage="org.hibernate.auction">
<classname="com.sitinspring.domain.User"
table="USERTABLE_OKB"lazy="false">
<idname="id"column="ID">
<generatorclass="uuid.hex"/>
</id>
<propertyname="name"column="name"/>
<propertyname="password"column="pswd"/>
<propertyname="email"column="email"/>
<propertyname="lastLoginTime"column="lastLoginTime"/>
<propertyname="lastLoginIp"column="lastLoginIp"/>
</class>
<queryname="user.sql">
<![CDATA[fromUserwhereemail='[email protected]']]>
</query>
</hibernate-mapping>Link: http://www.blogjava.net/junglesong/archive/2008/04/30/197560.html