版權聲明:本文爲博主原創文章,如需轉載請標註轉載地址。html
博客地址:http://www.cnblogs.com/caoyc/p/5606444.html 數組
hql="FROM User";session
List list= session.createQuery(hql).list();
for(Object obj:list){
System.out.println(obj);
}函數
【注意】:HQL語句中關鍵字不區分大小寫,可是實體類和對象屬性要區分大小寫spa
hql="SELECT name FROM User where id=1";code
方式一:xml
Object name= session.createQuery(hql).list().get(0);
System.out.println(name);
這種方式不被推薦,當若是id=0的User對象不存在是,使用get(0)會拋出異常,咱們一般使用下面這種方式htm
方式二:經過uniqueResult()方法,該方法返回一個Object對象,若是對象不存在則返回null,若是返回值不惟一,則拋出異常對象
1 Object name= session.createQuery(hql).uniqueResult(); 2 System.out.println(name)
hql="SELECT id,name FROM User";blog
List list= session.createQuery(hql).list(); for(Object obj:list){ System.out.println(Arrays.toString((Object[])obj)); }
list()返回的是一個List<Object>對象
hql="SELECT new User(id,name) FROM User";
List<User> list= session.createQuery(hql).list(); for(User user:list){ System.out.println(user); }
HQL經過new的方式能夠返回一個新的實體類,好比說上面經過new User(id,name)方式將id,name返回給User,要求User必須包含一個相對應的構造函數,不然會拋出異常,同時咱們還有應該給User指定一個默認的構造函數,不然使用From User也會拋出異常,由於這種方式採用的是默認構造。值得注意的是,若是使用的新構造對象,那麼處理指定的屬性會被賦予新值外,其它屬性均爲默認值。
hql="SELECT age, COUNT(age) num FROM User WHERE age>10 GROUP BY age HAVING COUNT(age)>1 ORDER BY num DESC";
在HAVING中,不能使用別名num,但在ORDER BY中可使用別名num
hql="FROM User where id=?";
User user= (User)session.createQuery(hql) .setParameter(0, 2) .uniqueResult(); System.out.println(user);
Hibernate和JDBC佔位符的區別:在Hibernate佔位符下標從0開始,在JDBC中的佔位符下標從1開始
hql="FROM User where id=:id";
User user= (User)session.createQuery(hql) .setParameter("id", 2) .uniqueResult(); System.out.println(user);
使用參數的方式,在HQL中在參數前面須要加上冒號
hql="FROM User where id IN (:ids)";
List<User> list= session.createQuery(hql) .setParameterList("ids", new Object[]{1,3,4}) .list(); for (User user : list) { System.out.println(user); }
若是咱們將HQL代碼寫在類中,那麼編譯後咱們很是難以維護,爲了後期代碼的可維護行,咱們須要將HQL代碼寫在對應類的.hbm.xml文件中,例如:
<query name="queryUserRanage"> FROM User WHERE id BETWEEN ? AND ? </query>
在Java代碼中
Query query=session.getNamedQuery("queryUserRanage"); List<User> list=query .setParameter(0, 10) .setParameter(1, 20) .list(); for(User user:list){ System.out.println(user); }
一般咱們使用參數的方式,這樣能夠很直觀知道每一個參數的做用
<query name="queryUserRanage"> FROM User WHERE id BETWEEN :minId AND :maxId </query>
可是若是在SQL語句中存在>、<等xml中特殊字符,這些字符在xml中都有特殊的意義,全部咱們不能直接這樣寫
【Error】
<query name="queryUserRanage"> FROM User WHERE id > :minId AND id< :maxId </query>
【Right】
<query name="queryUserRanage"> FROM User WHERE id > :minId AND < :maxId </query>
雖然上面的方式咱們能夠正確執行,可是代碼顯示不夠友好,全部咱們推薦使用下面的一種方式
<query name="queryUserRanage"> <![CDATA[FROM User WHERE id > :minId AND < :maxId]] </query>
CDATA代碼塊說明在代碼中的語句不須要轉義,咱們一個HQL都推薦用CDATA塊來包裹着