1. 程式人生 > >HQL和SQL查詢

HQL和SQL查詢

spa 包含 生成 2-0 連接 exec 刪除對象 別名 ets

轉自http://blog.csdn.net/aaa1117a8w5s6d/article/details/7757097

HQL和SQL的區別

標簽: sqlhibernatejavasessionuser數據庫

目錄(?)[+]

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代碼 技術分享
  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集合中存儲的是數組對象

2、新增

在數據庫中新增記錄在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. }

3、更新

在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、刪除

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();
  16. }

HQL和SQL查詢