JPQL一些簡單的查詢語法
JPQL --> JPA Query Language --> JPA的查詢語句 (另外HQL:Hibernate的查詢語句)
JPQL本質:JPA通過antlr-2.7.7.jar將JPQL編譯成sql並且封裝執行的。
JPQL和SQL區別?? --> 它們查詢的關鍵字都是一樣的,但JPQL是面向物件的(JPQL只能寫java的類名和屬性名)
JPQL書寫規則
JPA的查詢語言,類似於sql
①裡面不能出現表名,列名,只能出現java的類名,屬性名,區分大小寫
②出現的sql關鍵字是一樣的意思,不區分大小寫
③不能寫select * 要寫select 別名
JPQL查詢語法: ---(面向物件)
查詢所有使用者【查詢實體型別】:
"select o from User o" --> User:類名 o:別名
查詢所有使用者的姓名和所屬部門名稱 【查詢特定屬性】
方式①:"select o.name,o.department.name from User o"
注意:此時接收資料 型別用Object[]陣列 --(涉及到查詢出多個類裡面資料的時候一般都需要使用Object[]陣列接收資料!)
ex:List<Object[]> resultList = query.getResultList();
方式②(new一個構造器):"select new User(o.name,o.department.name) from User o"
注意:此時User類裡面需要加無參構造和下面
public User(String name, String departmentName) {
this.name = name;
this.department = new Department();
this.department.setName(departmentName);
}
查詢出所有在成都和廣州工作的人【查詢結果過濾】:
方式①:"select o from User o where o.department.city='成都' or o.department.city='廣州' "
--> User類裡面關聯著Department類,Department類裡面有city欄位
方式②:String jpql = "select o from User o where o.department.city=? or o.department.city=?"
Query query = entityManager.createQuery(jpql);
query.setParameter(1, "成都"); //為JPQL的?設定值 【注意:這裡是從1開始計算的】
query.setParameter(2, "廣州");
方式③:"select o from User o where o.department.city=?1 or o.department.city=?2"
Query query = entityManager.createQuery(jpql);
//query.setParameter(1, "成都");
//query.setParameter(2, "廣州");
query.setParameter(1, "成都").setParameter(2, "廣州");
方式④:"select o from User o where o.department.city=:city1 or o.department.city=:city2"
Query query = entityManager.createQuery(jpql);
query.setParameter(1, "成都").setParameter(2, "廣州");
查詢出所有人資訊,按照月薪排序【查詢排序】
"select o from User o order by o.salary desc" //desc降序 asc升序
查詢出所有人資訊,按照部門編號排序【使用關聯物件屬性排序】
"select o from User o order by o.department.sn"
--> User類裡面關聯著Department類,Department類裡面有sn編號欄位
查詢出在春熙路和武侯街上班的使用者資訊【使用IN】
"select o from User o where o.department.street in(?1,?2)"
query.setParameter(1, "春熙路").setParameter(2, "武侯街");
查詢出工資在5000-6000的人【使用BETWEEN..AND..】
"select o from User o where o.salary between ?1 and ?2"
查詢出姓名包含er或者en的人【使用LIKE】
"select o from User o where o.name like ?1 or o.name like ?2"
query.setParameter(1, "er").setParameter(2, "en");
查詢出有使用者的部門【distinct】
"select distinct o.department from User o"
查詢出有人的部門【size】 --注意:在JPQL,所有集合都有一個size屬性
"select o from Department o where o.users.size>0"
--> Department類裡面用list集合 private List<User> users = new ArrayList<>();
查詢出部門資訊,按照部門的使用者人數排序【使用函式排序】
"select o from Department o order by o.users.size desc"
查詢出沒有人加入的部門【對集合使用size】
"select o from Department o where o.users.size=0"
查詢所有人的姓名和所屬部門名稱【查詢特定屬性】
"select o.id,o.name,d.name from User o left join o.department d"
查詢出市場部的人員資訊及電話:
"select e,p from Phone p join p.user e join e.department d where d.name='市場部'"
查詢出各個部門人員的平均工資和最高工資【使用聚集函式】
"select o.department.name,avg(o.salary),max(o.salary) from User o group by o.department.name"
查詢出各個部門參與人數報表:
方式①:"select d,count(e) from Department d left join d.users u group by d"
方式②:"select d,d.users.size from Department d"
查詢出大於平均工資的人員資訊
"select o from User o where o.salary > (select avg(salary) from User )"
注意事項:
①from後面的是一個類名
②如果涉及到查詢出的幾個值不是物件需要使用Object[]陣列接收資料!
③jpql支援 select new User(..) from ...
④where條件傳參時
?,? --> 從1開始計算
?1,?2 --> 自己定義順序
:name1,:name2 --> 自己取名字
⑤ like的時候 ?1 --> query.setParameter(1, "er") --> "%er%"
⑥JPQL中所有集合都有 size屬性
⑦JPQL中是支援關連(JOIN/LEFT JOIN)
兩個法則:1.JPQL自己會消除笛卡爾積 2.關聯 - 物件的別名.屬性