1. 程式人生 > >JPQL一些簡單的查詢語法

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.關聯  -  物件的別名.屬性