1. 程式人生 > >hibernate-hql查詢

hibernate-hql查詢

select可以省略,但不建議這麼做,儘量做到查詢精確。

hql是面向物件的不管返回值還是條件都是對物件而言,不是資料庫表。資料庫中的一條記錄就是一個物件。

1、根據條件查詢某個具體物件

Student s = (Student) session.createQuery("select s from Student s where s.id=2").uniqueResult();

uniqueResult()---返回唯一的結果集

2、查詢符合條件的多個物件

List<Student> students = session.createQuery("select s from Student s where s.teacher=2").list();

list()---返回物件的列表

3、查詢所有的物件

List<Student> students = session.createQuery("select s from Student s ").list();

4、查詢物件中的某些個欄位(2個以上)

List<Object[]> lists = (List<Object[]>)session.createQuery("select s.name,s.id from Student s ").list();

for(Object[] s:lists){

System.out.println(s[0]);

}

查詢結果是多個欄位的物件,這些個物件被裝在一個物件數組裡,陣列的每個元素是物件。lists中的元素是有兩個以物件為元素的物件陣列。

知道即可,可以直接查出物件,由物件獲取屬性即可。

4.1只查詢一個欄位時

List<String> lists = (List<String>)session.createQuery("select s.name from Student s ").list();

以返回值的型別構成列表(返回值的型別是類中定義的型別)

比如

這個值返回就是一個數字,但是它的型別是Teacher,你就必須用Teacher的列表去接受

4.查詢並且排序--order by

List<Student> students = session.createQuery("select s from Student s order by s.id desc").list();

desc---倒敘

asc(預設)---升序

5、去除重複欄位

List<Teacher> lists = (List<Teacher>)session.createQuery("select distinct s.teacher from Student s ").list();

6、帶名佔位符---:id (:name)

List<Student> lists = (List<Student>)session.createQuery("select s from Student s where s.id=:id")

.setParameter("id", 1)

.list();

上述要注意的一個,在hibernate5.2以後,特殊型別(比如setString())已經廢棄,統一由setParameter()替代,

另外一個,這個方法的返回值都是query,可以實現鏈式程式設計。

6.1統一佔位符

List<Student> lists = (List<Student>)session.createQuery("select s from Student s where s.id=?")

.setParameter(0, 1)

.list();

特別注意序號從0開始依次遞增

新版的已經更新

7、fetch為LAZY的時候,即使存在關聯關係也不會發出第二條sql語句

8、構建臨時物件(這個物件又名DTO,VO)

List<MsgInfo> lists = session.createQuery("select new com.bjsxt.hibernate.MsgInfo(m.id, m.cont, m.topic.title, m.topic.category.name) from Msg").list();

9、連線查詢

List<Object[]) lists = List<Object[])session.createQuery("select t.title, c.name from Topic t join t.category c ").list();

10、多行函式 max,min,avg ,count,sum

Long i = (Long) session.createQuery("select count(*) from Student s").uniqueResult();

返回值是Long型別

11、單行函式 between and

List<Student> lists = (List<Student>)session.createQuery("select s from Student s where s.id between 0 and 5").list();

11.1、在集合中in

List<Student> lists = (List<Student>)session.createQuery("select s from Student s where s.id in(1,2)").list();

11.3、 is null / is not null

List<Student> lists = (List<Student>)session.createQuery("select s from Student s where s.id is not null").list();

11.4、 is empty

List<Student> lists = (List<Student>)session.createQuery("select s from Student s where s.id is empty").list();

11.5、模糊查詢like 重要 %表示0或多個字元,_表示一個字元

List<Student> lists = (List<Student>)session.createQuery("select s from Student s where s.name like '_h%' ").list();

字元由單引號括起。

11.6、不常見

Query q = session.createQuery("select lower(t.title)," + "upper(t.title)," + "trim(t.title)," + "concat(t.title, '***')," +

"length(t.title)" + " from Topic t ");

lower--小寫 upper--大寫 trim--空值 concat--字符合並 length--字元長度

11.7、數學公式

Query q = session.createQuery("select abs(t.id)," +"sqrt(t.id)," + "mod(t.id, 2)" + " from Topic t ");

11.8拿到日期,時間,時間戳

Query q = session.createQuery("select current_date, current_time, current_timestamp,s.id from Student s");

List<Object[]> lists = q.list();

for(Object o : q.list()) {

Object[] arr = (Object[])o;

System.out.println(arr[0] + " | " + arr[1] + " | " + arr[2] + " | " + arr[3]);

}

12、分組 group by

Query q = session.createQuery("select t.title, count(*) from Topic t group by t.title") ;

13、where語句是對單條記錄進行過濾,不能用於分組後的過濾

可以用having來篩選分組後的資訊

Query q = session.createQuery("select t.title, count(*) from Topic t group by t.title having count(*) >= 1") ;

首先按標題分組,然後再過濾分組後的綜合大一的組

最後返回的是,按標題分組,分組後總和大於1的那些個組

14、子查詢

Query q = session.createQuery("from Topic t where t.id < (select avg(t.id) from Topic t)") ;

15、邏輯運算

Query q = session.createQuery("from Topic t where t.id < ALL (select t.id from Topic t where mod(t.id, 2)= 0) ") ;

<ALL 等價於小於最小的那個

16、exists

Query q = session.createQuery("from Topic t where not exists (select m.id from Msg m where m.topic.id=t.id)") ;

//用in 可以實現exists的功能

//但是exists執行效率高

17、執行更新語句

Query q = session.createQuery("update Topic t set t.title = upper(t.title)") ;

18、將查詢語句放在實體類中

Query q = session.getNamedQuery("topic.selectCertainTopic");

19、建立本地查詢--當所有的ql語句不能滿足時採用

SQLQuery q = session.createSQLQuery("select * from category limit 2,4").addEntity(Category.class);

20、QBC--Query by criterion

//criterion 標準/準則/約束

Criteria c = session.createCriteria(Topic.class) //from Topic

.add(Restrictions.gt("id", 2)) //greater than = id > 2

.add(Restrictions.lt("id", 8)) //little than = id < 8

.add(Restrictions.like("title", "t_"))

.createCriteria("category")

.add(Restrictions.between("id", 3, 5)) //category.id >= 3 and category.id <=5

;

//DetachedCriterea

for(Object o : c.list()) {

Topic t = (Topic)o;

System.out.println(t.getId() + "-" + t.getTitle());

}

21、QBE---query by example

Topic tExample = new Topic();

tExample.setTitle("T_");

Example e = Example.create(tExample)

.ignoreCase().enableLike();

Criteria c = session.createCriteria(Topic.class)

.add(Restrictions.gt("id", 2))

.add(Restrictions.lt("id", 8))

.add(e)

;

for(Object o : c.list()) {

Topic t = (Topic)o;

System.out.println(t.getId() + "-" + t.getTitle());

}

補充:

分頁查詢:

setFirstResult(int firstResult):設定從哪一個物件開始檢索,引數firstResukt表示這個物件在查詢結果中的索引位置,索引位置的起始值為0,預設情況下,Query從查詢結果中的第一個物件開始檢索。

setMaxResult(int maxResults):設定一次最多檢索出的物件的數目,在預設情況下,Query和Criteria介面檢索出查詢結果中所有物件。

EG://HQL查詢

Query query=session.createQuery(“from User user order by user.id”);

query.setFirstResult(3);

query.setMaxResults(4);

query.list();