天天看點

hibernate的三種查詢方式 Hibernate的查詢方式

Hibernate的查詢方式

hibernate的查詢方式常見的主要分為三種: HQL, QBC(命名查詢), 以及使用原生SQL查詢(SqlQuery)

一、HQL查詢

• HQL(Hibernate Query Language)提供了豐富靈活的查詢方式,使用HQL進行查詢也是Hibernate官方推薦使用的查詢方式。

• HQL在文法結構上和SQL語句十分的相同,是以可以很快的上手進行使用。使用HQL需要用到Hibernate中的Query對象,該對象專門執行HQL方式的操作。

     查詢所有示例

1
2
3
4
5
6
7
8
      
session.beginTransaction();
String hql = "from User"; // from 後跟的是要查詢的對象,而不是表
Query query = session.createQuery(hql);
List<User> userList = query.list();
for(User user:userList){
  System.out.println(user.getUserName());
}
session.getTransaction().commit();

           

            帶where的查詢示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
      
session.beginTransaction();
String hql = "from User where userName = 'James'";
Query query = session.createQuery(hql);
List<User> userList = query.list();
for(User user:userList){
  System.out.println(user.getUserName());
}
session.getTransaction().commit();
/*
 在HQL中where語句中使用的是持久化對象的屬性名,如上面示例中的userName。當然在HQL中也可以使用别名
*/
String hql = "from User as u where u.userName = 'James'";
/*
過濾條件 
在where語句中還可以使用各種過濾條件,如:=、<>、<、>、>=、<=、between、not between、
in、not in、is、like、and、or等
*/

           

            擷取一個不完整的對象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
      
session.beginTransaction();
String hql = "select userName from User";
Query query = session.createQuery(hql);
List<Object> nameList = query.list();
for(Object obj:nameList){
   String name=(String)obj;
   System.out.println(name);
}
session.getTransaction().commit();
// 多個屬性的話,需要用object[]接收
session.beginTransaction();
String hql = "select userName,userPwd from User";
Query query = session.createQuery(hql);
List nameList = query.list();
for(Object obj:nameList){
  Object[] array = (Object[]) obj; // 轉成object[]
  System.out.println("name:" + array[0]);
  System.out.println("pwd:" + array[1]);
}
session.getTransaction().commit();

           

                統計和分組查詢

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
      
session.beginTransaction();
String hql = "select count(*),max(id) from User";
Query query = session.createQuery(hql);
List nameList = query.list();
for(Object obj:nameList){
  Object[] array = (Object[]) obj;
  System.out.println("count:" + array[0]);
  System.out.println("max:" + array[1]);
}
session.getTransaction().commit();
/*  
 該條sql語句傳回的是單條資料,是以還可以這樣寫
 單列資料用Object,多列資料用Object[]
*/
Object[] object = (Object[]) query.uniqueResult();
System.out.println("count:" + object[0]);
System.out.println("max:" + object[1]);

           

                    更多寫法

1
2
3
4
5
6
7
      
select distinct name from Student;
select max(age) from Student;
select count(age),age from Student group by age;
from Student order by age;

           

                      HQL占位符

1
2
3
4
5
6
7
8
9
10
11
12
      
session.beginTransaction();
String hql = "from User where userName = ?";
Query query = session.createQuery(hql);
// 索引從0開始 
query.setString(0, "James");
List<User> userList = query.list();
for(User user:userList){
  System.out.println(user.getUserName());
}
session.getTransaction().commit();

           

                    HQL引用占位符

1
2
3
4
5
6
7
8
9
10
11
12
13
      
session.beginTransaction();
String hql = "from User where userName = :name";
Query query = session.createQuery(hql);
query.setParameter("name", "James");
List<User> userList = query.list();
for(User user:userList){
  System.out.println(user.getUserName());
}
session.getTransaction().commit();

           

                      HQL分頁

1
2
3
4
5
6
7
8
9
10
11
12
      
session.beginTransaction();
String hql = "from User";
Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(2);
List<User> userList = query.list();
for(User user:userList){
  System.out.println(user.getUserName());
}
session.getTransaction().commit();

           

二、QBC(Query By Criteria)查詢

• Criteria對象提供了一種面向對象的方式查詢資料庫。Criteria對象需要使用Session對象來獲得。

• 一個Criteria對象表示對一個持久化類的查詢。

                        查詢所有

1
2
3
4
5
6
7
8
9
10
11
      
session.beginTransaction();
Criteria c = session.createCriteria(User.class);
List<User> userList = c.list();
for(User user:userList){
  System.out.println(user.getUserName());
}
session.getTransaction().commit();

           

                        where

1
2
3
4
5
6
7
8
9
10
11
      
session.beginTransaction();
Criteria c = session.createCriteria(User.class);
c.add(Restrictions.eq("userName", "James"));
List<User> userList = c.list();
for(User user:userList){
  System.out.println(user.getUserName());
}
session.getTransaction().commit();

           

                Restrictions對象

1
2
3
4
5
6
7
8
9
10
11
12
      
方法名稱                  對應SQL中的表達式
----------------------------------------------------------
Restrictions.eq       field = value
Restrictions.gt       field > value
Restrictions.lt       field < value
Restrictions.ge      field >= value
Restrictions.le       field <= value
Restrictions.between      field between value1 and value2
Restrictions.in       field in(…)
Restrictions.and      and
Restrictions.or       or
Restrictions.like     field like value

           

                      示例

1
2
3
4
5
6
      
Criteria c = session.createCriteria(User.class);
c.add(Restrictions.like("userName", "J"));
c.add(Restrictions.eq("id", 120));
c.add(Restrictions.or(Restrictions.eq("userName", "James"),
  Restrictions.eq("userName", "Alex")));

           

                        擷取唯一記錄

1
2
3
4
5
6
7
8
9
10
      
session.beginTransaction();
Criteria c = session.createCriteria(User.class);
c.add(Restrictions.eq("id", 120));
User user = (User) c.uniqueResult();
System.out.println(user.getUserName());
session.getTransaction().commit();

           

                      分頁

1
2
3
4
      
Criteria c = session.createCriteria(User.class);
c.setFirstResult(0);
c.setMaxResults(5);

           

                       分組與統計

1
2
3
4
5
6
7
8
9
10
      
session.beginTransaction();
Criteria c = session.createCriteria(User.class);
c.setProjection(Projections.sum("id"));
Object obj = c.uniqueResult();
System.out.println(obj);
session.getTransaction().commit();

           

                    Projections對象

1
2
3
4
5
6
7
8
9
      
方法名稱                          描述
-------------------------------------------------------
Projections.sum           等于SQL中聚合函數sum
Projections.avg           等于SQL中聚合函數avg
Projections.count         等于SQL中聚合函數count
Projections .distinct     去除重複記錄
Projections.max           等于SQL中聚合函數max
Projections.min           等于SQL中聚合函數min
Projections .groupProperty  對指定的屬性進行分組查詢

           

                    多個統計與分組

1
2
3
4
5
6
7
8
9
10
11
12
13
14
      
session.beginTransaction();
Criteria c = session.createCriteria(User.class);
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.sum("id"));
projectionList.add(Projections.min("id"));
c.setProjection(projectionList);
// 和HQL一樣,單列用Object,多列用Object[] 
Object[] obj = (Object[]) c.uniqueResult();
System.out.println("sum:" + obj[0]);
System.out.println("min:" + obj[1]);

           

                      排序

1
2
3
      
Criteria c = session.createCriteria(User.class);
c.addOrder(Order.desc("id"));

           

三、原生SQL查詢:

                       示例

1
2
3
4
5
6
7
8
9
10
11
12
      
session.beginTransaction();
String sql = "select id,username,userpwd from t_user";
List list = session.createSQLQuery(sql).list();
for(Object item : list){
  Object[] rows = (Object[]) item;
  System.out.println("id:" + rows[0] + "username:"
    + rows[1] + "userpwd:" + rows[2]);
}
session.getTransaction().commit();

           

                  addEntity()示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
      
session.beginTransaction();
String sql = "select id,username,userpwd from t_user";
// addEntity()可以告訴Hibernate你想要封裝成對象的類型,然後自動為你封裝
SQLQuery query = session.createSQLQuery(sql).addEntity(User.class);
List<User> list = query.list();
for(User user : list){
  System.out.println(user.getUserName());
}
session.getTransaction().commit();

           

              uniqueResult示例

1
2
3
4
5
6
7
8
9
10
      
session.beginTransaction();
String sql = "select id,username,userpwd from t_user where id = 2";
SQLQuery query = session.createSQLQuery(sql).addEntity(User.class);
User user = (User) query.uniqueResult();
System.out.println(user.getUserName());
session.getTransaction().commit();

           
hibernate的三種查詢方式 Hibernate的查詢方式