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();