SQL和HQL 區別淺析!!!

hql是面向對象查詢,格式:from + 類名 + 類對象 + where + 對象的屬性java

sql是面向數據庫表查詢,格式:from + 表名 + where + 表中字段mysql

一、查詢

通常在hibernate中使用查詢時,推薦使用hql(Hibernate Query Language)查詢語句。sql

使用hql的時候須要注意:數據庫

A、大小寫敏感數組

由於hql是面向對象的,而對象類的名稱和屬性都是大小寫敏感的,因此hql也是大小寫敏感的。所以,在編寫hql語句的時候,必定要注意大小寫。緩存

B、from子句session

from子句的形式和sql基本相似,不過通常會給類名起一個別名(如from Dog d,其中d就是Dog類的對象)函數

對於多表查詢的鏈接,則和sql徹底同樣(如from Dog d,Cat c)spa

 

1.1簡單查詢舉例.net

Java代碼   收藏代碼
  1. List list = session.createQuery("(select user)from Useras user order by user.loginName").list();  

注:標紅的表示可與省略,省略select關鍵字至關於sql的select *

 

1.2採用佔位符查詢

Java代碼   收藏代碼
  1. Query query = session.createQuery("select u.id, u.name from User u where u.name like ?");  
  2. query.setParameter(0, 「%王%");  
  3. List users = query.list();  

Java代碼   收藏代碼
  1. List users = session.createQuery("select u.id, u.name from User u where u.name like ?").setParameter(0, 「%王%").list();  

注:在Hibernate中第1個佔位符的下標位置從0開始

 

1.3採用參數命名的形式

單一條件:

Java代碼   收藏代碼
  1. List users = session.createQuery("select u.id, u.name from User u where u.name like :myname").setParameter("myname", "%張%").list();  

多條件:

Java代碼   收藏代碼
  1. List users = session.createQuery("select u.id, u.name from User u where u.name like :myname and u.id=:myid").setParameter("myname", "%張%").setParameter("myid", 1) .list();  

注:定義命名參數固定格式::+參數名稱(即:myid ),賦值時,直接寫參數名便可: setParameter("myid", 1),setParameter方法用於爲參數賦單一值

 

1.4採用in關鍵字查詢

Java代碼   收藏代碼
  1. List users = session.createQuery("select u.id, u.name from User u where u.idin(:myids)").setParameterList("myids", new Object[]{1, 2, 3, 4, 5}).list();  

注:因爲in中的條件是集合的形式,因此賦值是須要採用setParameterList這種方法,賦的值則採用對象數組的形式。

 

1.5查詢數量

Java代碼   收藏代碼
  1. int count = (Integer) session.createQuery("select count(*) from User").uniqueResult().intValue();  

 

1.6限制查詢起始值和數量的查詢

Java代碼   收藏代碼
  1. String hql = "from User as user order by user.loginName";  
  2. int firstResult= 50;  
  3. int maxResults = 50;  
  4. Query query = session.createQuery(hql);  
  5. query = query.setFirstResult(firstResult);  
  6. query.setMaxResults(maxResults);  

 

注:這種通常是在記錄須要分頁的時候須要用到,例如,在上面的代碼中,限制查詢的開始記錄的位置爲50,最大查詢條數爲50。

 

1.7子查詢

Java代碼   收藏代碼
  1. String hql = "from User user where user.loginName not in(select ur.user.loginName from UserRole ur) ";  
  2. List list = (session.createQuery(hql)).list();  

注:在某些狀況下,也須要用到子查詢,例如在下面的例子中,User爲用戶對象,UserRole爲用戶與角色關聯對象。以下HQL語句將沒有分配角色的用戶對象查找出來。

 

1.8查詢某一時間段的數據

Java代碼   收藏代碼
  1. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  2. //查詢2010-06-10到2010-07-31入職的員工  
  3. List users = session.createQuery("select u.id, u.name from User u where u.create_time between ? and ?").setParameter(0, sdf.parse("2010-06-10 00:00:00")).setParameter(1, sdf.parse("2010-07-31 23:59:59")).list();  

 

1.9使用數據庫函數查詢   ---- 不推薦

Java代碼   收藏代碼
  1. String timeUnit = "13";  
  2. String sql = "select count(*) count, CONVERT(VARCHAR(" + timeUnit +"), log.gen_datetime,121) timeUnit " + "from Log log";  
  3. SQLQuery query = session.createSQLQuery(sql).addScalar("count", Hibernate.INTEGER).addScalar("timeUnit", Hibernate.STRING);  
  4. List list = query.list();  

注:對於某些複雜的查詢語句,須要調用某種特定的數據庫的特定函數才能解決,Hibernate雖然不推薦使用原生SQL語句來查詢,由於這將破壞數據庫的易移植性,可是Hibernate中也提供了使用原生SQL進行查詢的方法,只須要得到鏈接便可。 

 

1.10使用原生SQL語句查詢

Java代碼   收藏代碼
  1. List users = session.createSQLQuery("select * from t_user").list();  

注:使用原生SQL語句,須要使用:SQLQuery接口;使用原生SQL語句時,不會往Session(一級)緩存中放入數據,即SQLQuery接口中的list()方法不會往Session(一級)緩存中放入數據;SQLQuery接口的list()方法返回的List集合中存儲的是數組對象

二、新增

在數據庫中新增記錄在Hibernate中不須要使用insert命令,只須要構造新增的對象後,調用Session對象的save(…)方法便可。

 

2.1新增單個對象

新增單個對象的實例以下,該實例將在用戶表中新增一條記錄。

Java代碼   收藏代碼
  1.  Session session = HibernateSessionFactory.getSession();  
  2.  Transaction ts = null;  
  3.  try {  
  4.        ts = session.beginTransaction();  
  5.        User user = new User();  
  6.        user.setLoginName("amigo");  
  7.        user.setFullName("阿蜜果");  
  8.        ……  
  9.       session.save(user) ;  
  10.       ts.commit();  
  11.  } catch (Exception e) {  
  12.     if (ts != null) {  
  13.         ts.rollback();  
  14.     }  
  15. finally {  
  16.    HibernateSessionFactory.closeSession();  
  17. }  

 

2.2新增批量對象

對於批量新增對象的狀況,須要在新增一部分對象後flush和clear一次,例如,每批量新增20個對象時手動的flush一次,假設在list爲一個用戶列表,裏面包含不少User對象,那麼要將實現這些對象的批量新增,可採用以下方法

Java代碼   收藏代碼
  1.               Session session = HibernateSessionFactory.getSession();  
  2. Transaction ts = null;  
  3. try {  
  4.     ts = session.beginTransaction();  
  5.     for (int i = 0; i < list.size(); i++) {  
  6.         User user = (User) list.get(i);  
  7.         session.save(user);  
  8.         if (i % 20 == 0) {  
  9.             session.flush();  
  10.             session.clear();  
  11.         }  
  12.     }  
  13.     ts.commit();  
  14. catch (Exception e) {  
  15.     if (ts != null) {  
  16.         ts.rollback();  
  17.     }  
  18. finally {  
  19.     HibernateSessionFactory.closeSession();  
  20. }  

 

三、更新

在hibernate中,更新對象前不須要使用查詢語句:update…,通常須要在取得須要更新的持久化對象後,執行Session對象的update(…)方法。例如:

Java代碼   收藏代碼
  1. Session session = HibernateSessionFactory.getSession();  
  2. Transaction ts = null;  
  3. try {  
  4.     ts = session.beginTransaction();  
  5.     //取得持久化對象  
  6.     User user = session.get(User.class, "amigo");  
  7.     //對須要修改的屬性進行修改  
  8.     user.setFullName("阿蜜果");  
  9.     ……  
  10.     session.update(user) ;  
  11.     ts.commit();  
  12. catch (Exception e) {  
  13.     if (ts != null) {  
  14.         .rollback();  
  15.     }  
  16. finally {  
  17.     HibernateSessionFactory.closeSession();  
  18. }  

 

四、刪除

4.1刪除單個對象

通常在取得某對象後,開發人員能夠調用Session對象的delete(…)方法刪除該對象。
Eg. 下面的實例中取得loginName(主鍵)爲「amigo」的User對象後,將它刪除。

Java代碼   收藏代碼
  1. Session session = HibernateSessionFactory.getSession();  
  2. Transaction ts = null;  
  3. try {  
  4.     ts = session.beginTransaction();  
  5.     //取得持久化對象  
  6.         User user = session.get(User.class, "amigo");  
  7.     session.delete(user) ;  
  8.     ts.commit();  
  9. catch (Exception e) {  
  10.     if (ts != null) {  
  11.         ts.rollback();  
  12.     }  
  13. finally {  
  14.     HibernateSessionFactory.closeSession();  
  15. }  

 

4.2批量刪除對象

對於批量刪除對象的狀況,開發人員能夠在取得待刪除的對象列表後,一個一個的將對象刪除,對於每一個對象的刪除方法,見3.4.1小節。開發人員還能夠hql語句來作批量刪除。
Eg. 該實例經過delete語句來刪除記錄,除了loginName爲「amigo」的對象爲,其他都刪除,代碼以下所示:

Java代碼   收藏代碼
    1. Session session = HibernateSessionFactory.getSession();  
    2. Transaction ts = null;  
    3. try {  
    4.     ts = session.beginTransaction();  
    5.     String hql = "delete User as user where user.loginName != 'amigo'";  
    6.     Query query = session.createQuery(hql);  
    7.     int count = query.executeUpdate();  
    8.     ts.commit();  
    9.     System.out.println("delete count : " + count); //刪除條數  
    10. catch (Exception e) {  
    11.     if (ts != null) {  
    12.         ts.rollback();  
    13.     }  
    14. finally {  
    15.     HibernateSessionFactory.closeSession();  
相關文章
相關標籤/搜索