Hibernate HQL詳解


版權聲明:本文為博主原創文章,如需轉載請標注轉載地址。

博客地址:http://www.cnblogs.com/caoyc/p/5606444.html 

1、實體查詢:

  hql="FROM User";

List list= session.createQuery(hql).list();

 for(Object obj:list){
  System.out.println(obj);
  }

  【注意】:HQL語句中關鍵字不區分大小寫,但是實體類和對象屬性要區分大小寫

 

2、查詢某個對象的某個屬性

  hql="SELECT name FROM User where id=1";

  方式一:

Object name= session.createQuery(hql).list().get(0);
System.out.println(name);

  這種方式不被推薦,當如果id=0的User對象不存在是,使用get(0)會拋出異常,我們通常使用下面這種方式

  方式二:通過uniqueResult()方法,該方法返回一個Object對象,如果對象不存在則返回null,如果返回值不唯一,則拋出異常

1 Object name= session.createQuery(hql).uniqueResult();
2 System.out.println(name)

 

3、查詢其中幾列數據,返回一個數組

  hql="SELECT id,name FROM User";

List list= session.createQuery(hql).list();
for(Object obj:list){
    System.out.println(Arrays.toString((Object[])obj));
}

  list()返回的是一個List<Object>對象

 

4、查詢其中幾列數據,返回一個實體類

  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也會拋出異常,因為這種方式采用的是默認構造。值得注意的是,如果使用的新構造對象,那么處理指定的屬性會被賦予新值外,其它屬性均為默認值。

  

5、WHER、GROUP BY、HAVING和ORDER綜合使用

  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

 

6、使用占位符"?"

  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開始

 

7、使用參數

  hql="FROM User where id=:id";

User user= (User)session.createQuery(hql)
        .setParameter("id", 2)
        .uniqueResult();
System.out.println(user);

  使用參數的方式,在HQL中在參數前面需要加上冒號

 

8、使用集合或數組參數

  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);
}

 

9、使用命名方式查詢

  如果我們將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 &gt; :minId AND &lt; :maxId
</query>

 

  雖然上面的方式我們可以正確執行,但是代碼顯示不夠友好,所有我們推薦使用下面的一種方式

<query name="queryUserRanage">
    <![CDATA[FROM User WHERE id > :minId AND < :maxId]]
</query>

  CDATA代碼塊說明在代碼中的語句不需要轉義,我們一個HQL都推薦用CDATA塊來包裹着

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM