HQL介紹
Hibernate中不使用SQL而是有自己的面向?qū)ο蟛樵冋Z言,該語言名為Hibernate查詢語言(Hibernate Query Language).HQL被有意設(shè)計(jì)成類似SQL,這樣開發(fā)人員可以利用已有的SQL知識(shí),降低學(xué)習(xí)坡度.它支持常用的SQL特性,這些特性被封裝成面向?qū)ο蟮牟樵冋Z言,從某種意義上來說,由HQL是面向?qū)ο蟮?因此比SQL更容易編寫.
本文將逐漸介紹HQL的特性.
查詢數(shù)據(jù)庫中所有實(shí)例
要得到數(shù)據(jù)庫中所有實(shí)例,HQL寫為”from 對(duì)象名”即可,不需要select子句,當(dāng)然更不需要Where子句.代碼如右.
Query query=session.createQuery("from User");
List<User> users=(List<User>)query.list();
for(User user:users){
System.out.println(user);
}
限制返回的實(shí)例數(shù)
設(shè)置查詢的maxResults屬性可限制返回的實(shí)例(記錄)數(shù),代碼如右:
Query query=session.createQuery("from User order by name");
query.setMaxResults(5);
List<User> users=(List<User>)query.list();
System.out.println("返回的User實(shí)例數(shù)為"+users.size());
for(User user:users){
System.out.println(user);
}
分頁查詢
分頁是Web開發(fā)的常見課題,每種數(shù)據(jù)庫都有自己特定的分頁方案,從簡單到復(fù)雜都有.在Hibernate中分頁問題可以通過設(shè)置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實(shí)例數(shù)為"+users.size());
for(User user:users){
System.out.println(user);
}
條件查詢
條件查詢只要增加Where條件即可.
代碼如右:
Hibernate中條件查詢的實(shí)現(xiàn)方式有多種,這種方式的優(yōu)點(diǎn)在于能顯示完整的SQL語句(包括參數(shù))如下.
select
user0_.ID as ID0_,
user0_.name as name0_,
user0_.pswd as pswd0_,
user0_.email as email0_,
user0_.lastLoginTime as lastLogi5_0_,
user0_.lastLoginIp as lastLogi6_0_
from
USERTABLE_OKB user0_
where
user0_.name like '何%'
public static void fetchByName(String prefix){
Session session=HibernateUtil.getSession();
Query query=session.createQuery("from User where name like'"+prefix+"%'");
List<User> users=(List<User>)query.list();
System.out.println("返回的User實(shí)例數(shù)為"+users.size());
for(User user:users){
System.out.println(user);
}
HibernateUtil.closeSession(session);
}
位置參數(shù)條件查詢
HQL中也可以象jdbc中PreparedStatement一樣為SQL設(shè)定參數(shù),但不同的是下標(biāo)從0開始.
代碼如右:
public static void fetchByPos(String prefix){
Session session=HibernateUtil.getSession();
Query query=session.createQuery("from User where name=?");
// 注意下標(biāo)是從0開始,和jdbc中PreparedStatement從1開始不同
query.setParameter(0, prefix);
List<User> users=(List<User>)query.list();
System.out.println("返回的User實(shí)例數(shù)為"+users.size());
for(User user:users){
System.out.println(user);
}
HibernateUtil.closeSession(session);
}
命名參數(shù)條件查詢
使用位置參數(shù)條件查詢最大的不便在于下標(biāo)與?號(hào)位置的對(duì)應(yīng)上,如果參數(shù)較多容易導(dǎo)致錯(cuò)誤.這時(shí)采用命名參數(shù)條件查詢更好.
使用命名參數(shù)時(shí)無需知道每個(gè)參數(shù)的索引位置,這樣就可以節(jié)省填充查詢參數(shù)的時(shí)間.
如果有一個(gè)命名參數(shù)出現(xiàn)多次,那在每個(gè)地方都會(huì)設(shè)置它.
public static void fetchByNamedParam(){
Session session=HibernateUtil.getSession();
Query query=session.createQuery("from User where name=:name");
query.setParameter("name", "李白");
List<User> users=(List<User>)query.list();
System.out.println("返回的User實(shí)例數(shù)為"+users.size());
for(User user:users){
System.out.println(user);
}
HibernateUtil.closeSession(session);
}
命名查詢
命名查詢是嵌在XML映射文件中的查詢。通常,將給定對(duì)象的所有查詢都放在同一文件中,這種方式可使維護(hù)相對(duì)容易些。命名查詢語句寫在映射定義文件的最后面。
執(zhí)行代碼如下:
Session session=HibernateUtil.getSession();
Query query=session.getNamedQuery("user.sql");
List<User> users=(List<User>)query.list();
System.out.println("返回的User實(shí)例數(shù)為"+users.size());
for(User user:users){
System.out.println(user);
}
HibernateUtil.closeSession(session);
映射文件節(jié)選:
<hibernate-mapping package="org.hibernate.auction">
<class name="com.sitinspring.domain.User"
table="USERTABLE_OKB" lazy="false">
<id name="id" column="ID" >
<generator class="uuid.hex"/>
</id>
<property name="name" column="name" />
<property name="password" column="pswd" />
<property name="email" column="email" />
<property name="lastLoginTime" column="lastLoginTime" />
<property name="lastLoginIp" column="lastLoginIp" />
</class>
<query name="user.sql">
<![CDATA[from User where email='2@2.3']]>
</query>
</hibernate-mapping>