1. 程式人生 > >HQL和SQL的區別及createQuery和createSQLQuery區別

HQL和SQL的區別及createQuery和createSQLQuery區別

hql是面向物件查詢,格式:from + 類名 + 類物件 + where + 物件的屬性

sql是面向資料庫表查詢,格式:from + 表名 + where + 表中欄位

1、查詢

一般在Hibernate中使用查詢時,推薦使用hql(Hibernate Query Language)查詢語句。

使用hql的時候需要注意:

A、大小寫敏感

因為hql是面向物件的,而物件類的名稱和屬性都是大小寫敏感的,所以hql也是大小寫敏感的。因此,在編寫hql語句的時候,一定要注意大小寫。

B、from子句

from子句的形式和sql基本類似,不過一般會給類名起一個別名(如from Dog d,其中d就是Dog類的物件)

對於多表查詢的連線,則和sql完全一樣(如from Dog d,Cat c)

1.1簡單查詢舉例

Java程式碼  

List list = session.createQuery("(select user)from Useras user order by user.loginName").list();   

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

1.2採用佔位符查詢

Java程式碼  Query query = session.createQuery("select u.id, u.name from User u where u.name like ?");  
query.setParameter(0, “%王%");  List users = query.list();  

Java程式碼  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程式碼  List users = session.createQuery("select u.id, u.name from User u where u.name like :myname"
).setParameter("myname""%張%").list();  

多條件:

Java程式碼  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程式碼  List users = session.createQuery("select u.id, u.name from User u where u.idin(:myids)").setParameterList("myids"new Object[]{12345}).list();  

注:由於in中的條件是集合的形式,所以賦值是需要採用setParameterList這種方法,賦的值則採用物件陣列的形式。

1.5查詢數量

Java程式碼  int count = (Integer) session.createQuery("select count(*) from User").uniqueResult().intValue();  

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

Java程式碼  String hql = "from User as user order by user.loginName";  int firstResult= 50;  int maxResults = 50;  Query query = session.createQuery(hql);  query = query.setFirstResult(firstResult);  query.setMaxResults(maxResults);  

注:這種一般是在記錄需要分頁的時候需要用到,例如,在上面的程式碼中,限制查詢的開始記錄的位置為50,最大查詢條數為50。

1.7子查詢

Java程式碼  String hql = "from User user where user.loginName not in(select ur.user.loginName from UserRole ur) ";  List list = (session.createQuery(hql)).list();  

注:在某些情況下,也需要用到子查詢,例如在下面的例子中,User為使用者物件,UserRole為使用者與角色關聯物件。如下HQL語句將沒有分配角色的使用者物件查找出來。

1.8查詢某一時間段的資料

Java程式碼  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  //查詢2010-06-10到2010-07-31入職的員工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程式碼  String timeUnit = "13";  String sql = "select count(*) count, CONVERT(VARCHAR(" + timeUnit +"), log.gen_datetime,121) timeUnit " + "from Log log";  SQLQuery query = session.createSQLQuery(sql).addScalar("count", Hibernate.INTEGER).addScalar("timeUnit", Hibernate.STRING);  List list = query.list();  

注:對於某些複雜的查詢語句,需要呼叫某種特定的資料庫的特定函式才能解決,Hibernate雖然不推薦使用原生SQL語句來查詢,因為這將破壞資料庫的易移植性,但是Hibernate中也提供了使用原生SQL進行查詢的方法,只需要獲得連線即可。 

1.10使用原生SQL語句查詢

Java程式碼  List users = session.createSQLQuery("select * from t_user").list();  

注:使用原生SQL語句,需要使用:SQLQuery介面;使用原生SQL語句時,不會往Session(一級)快取中放入資料,即SQLQuery介面中的list()方法不會往Session(一級)快取中放入資料;SQLQuery介面的list()方法返回的List集合中儲存的是陣列物件

2、新增

在資料庫中新增記錄在Hibernate中不需要使用insert命令,只需要構造新增的物件後,呼叫Session物件的save(…)方法即可。

2.1新增單個物件

新增單個物件的例項如下,該例項將在使用者表中新增一條記錄。

Java程式碼  

 Session session = HibernateSessionFactory.getSession();   

 Transaction ts = null;   

 try {   

       ts = session.beginTransaction();   

       User user = new User();   

       user.setLoginName("amigo");   

       user.setFullName("阿蜜果");   

       ……   

      session.save(user) ;   

      ts.commit();   

 } catch (Exception e) {   

    if (ts != null) {   

        ts.rollback();   

    }   

finally {   

   HibernateSessionFactory.closeSession();   

}   

2.2新增批量物件

對於批量新增物件的情況,需要在新增一部分物件後flush和clear一次,例如,每批量新增20個物件時手動的flush一次,假設在list為一個使用者列表,裡面包含很多User物件,那麼要將實現這些物件的批量新增,可採用如下方法

Java程式碼  

              Session session = HibernateSessionFactory.getSession();   

Transaction ts = null;   

try {   

    ts = session.beginTransaction();   

    for (int i = 0; i < list.size(); i++) {   

        User user = (User) list.get(i);   

        session.save(user);   

        if (i % 20 == 0) {   

            session.flush();   

            session.clear();   

        }   

    }   

    ts.commit();   

catch (Exception e) {   

    if (ts != null) {   

        ts.rollback();   

    }   

finally {   

    HibernateSessionFactory.closeSession();   

}   

3、更新

在hibernate中,更新物件前不需要使用查詢語句:update…,一般需要在取得需要更新的持久化物件後,執行Session物件的update(…)方法。例如:

Java程式碼  

Session session = HibernateSessionFactory.getSession();   

Transaction ts = null;   

try {   

    ts = session.beginTransaction();   

    //取得持久化物件 

    User user = session.get(User.class"amigo");   

    //對需要修改的屬性進行修改 

    user.setFullName("阿蜜果");   

    ……   

    session.update(user) ;   

    ts.commit();   

catch (Exception e) {   

    if (ts != null) {   

        .rollback();   

    }   

finally {   

    HibernateSessionFactory.closeSession();   

}   

4、刪除

4.1刪除單個物件

一般在取得某物件後,開發人員可以呼叫Session物件的delete(…)方法刪除該物件。
Eg. 下面的例項中取得loginName(主鍵)為“amigo”的User物件後,將它刪除。

Java程式碼  

Session session = HibernateSessionFactory.getSession();   

Transaction ts = null;   

try {   

    ts = session.beginTransaction();   

    //取得持久化物件 

        User user = session.get(User.class"amigo");   

    session.delete(user) ;   

    ts.commit();   

catch (Exception e) {   

    if (ts != null) {   

        ts.rollback();   

    }   

finally {   

    HibernateSessionFactory.closeSession();   

}   

4.2批量刪除物件

對於批量刪除物件的情況,開發人員可以在取得待刪除的物件列表後,一個一個的將物件刪除,對於每個物件的刪除方法,見3.4.1小節。開發人員還可以hql語句來做批量刪除。
Eg. 該例項通過delete語句來刪除記錄,除了loginName為“amigo”的物件為,其餘都刪除,程式碼如下所示:

Java程式碼  

Session session = HibernateSessionFactory.getSession();   

Transaction ts = null;   

try {   

    ts = session.beginTransaction();   

    String hql = "delete User as user where user.loginName != 'amigo'";   

    Query query = session.createQuery(hql);   

    int count = query.executeUpdate();   

    ts.commit();   

    System.out.println("delete count : " + count); //刪除條數 

catch (Exception e) {   

    if (ts != null) {   

        ts.rollback();   

    }   

finally {   

    HibernateSessionFactory.closeSession();   



原文出處:http://chengkai.wang/java/50.html

            </div>
                </div>