|
select name ,age from user; //原生SQL語句 select u.name,u.age from User u; //JPQL語句 select u from User u; //JPQL語句 SQL語句是在數(shù)據(jù)庫空間中對字段,列,行進(jìn)行操作 JPQL語句是在EJB實(shí)體空間中面向?qū)ο?屬性進(jìn)行操作 JPQL必須由JPA的JPQL解析器解析為SQL才能執(zhí)行,必須先獲取Query對象 參數(shù)查詢 1命名參數(shù)查詢 entityManager.createQuery("select u from User u where u.age=:param"); query.setParameter("param",24); List<User> result=(List<User>)query.getResultList(); 2位置參數(shù)查詢 "select u from User u where u.age=?1" query.setParameter(1,24); 3實(shí)體參數(shù)(JPQL中除了基本類型外,還可以是對象類型) "select u from User u where u.person=?1" Person p=new Person(); p.setId(1); query.setParameter(1,p); JPQL運(yùn)算符 算術(shù)運(yùn)算符 + - * / 關(guān)系運(yùn)算符 = > < >= <= <> 邏輯運(yùn)算符 between ,like , in , is null,is empty,member of,not ,and ,or 1 not "select u from User u where not(u.cityid=?1)" 2 between和sql中一樣 3 in 在給定的值列表中查詢 "select u from User u where u.cityid in(1,2,3)" 4 like ( _ 表示一個(gè)字符,%表示任意數(shù)量字符 ) xxxx where u.name like ' 張% ' 5 is null (實(shí)體的屬性是否為空,即實(shí)體屬性映射的字段是否為空) "select u from User u where u.cityid is null" 6 is empty (與is null 不同的是,它針對實(shí)體的集合屬性 內(nèi)有沒有元素。 雖然集合對象是存在的,但是集合內(nèi)沒有元素) select o from Order o where o.orderItems is empty 條件查詢 1排序查詢 asc升序 desc降序 order by p.age desc,p.birthday asc 2聚合函數(shù)查詢 avg() 平均值,返回Double count()返回Long max() min() sum() 以上除了count外其它的函數(shù)的參數(shù)對應(yīng)的是 單個(gè)的字段,即屬性而不是對象 HAVING和WHERE的區(qū)別。一個(gè)是先分組,再對組進(jìn)行篩選;一個(gè)是先篩選,然后對篩選后的記錄進(jìn)行分組。 構(gòu)造器查詢 "select new com.jsun.Person(p.name) from Person p" Person有這個(gè)構(gòu)造器時(shí),即Person(String name),成功返回對象。 關(guān)聯(lián)查詢(實(shí)際工作中仍然會有這種需求) left join 允許右邊實(shí)體表達(dá)式的實(shí)體為空,這里的實(shí)體指 集合屬性 inner join 右邊必須存在 "select o from Order o inner join o.orderItems" 在默認(rèn)查詢中,集合屬性是懶加載的。只有用的時(shí)候JPA才會再發(fā)SQL語句 在查詢的時(shí)候我們希望一次全抓取出來怎么辦?用 fetch (其實(shí)left join和inner join在這里使用主要是為了配合fetch,一次抓取,因?yàn)槟J(rèn)的是懶加載) "select o from Order o inner join fetch o.orderItems" 排除相同記錄DISTINCT select distinct o from Order o (還可以配合聚合函數(shù)使用) 如 select count(distinct o) from Order o JPQL內(nèi)置函數(shù) 字符串函數(shù) concat(str1,str2) substring(string,position,length) trim( [leading | trailing | both] sub_str from str) upper(str) lower(str) length(str) locate(searchString,initPosition) 日期,時(shí)間函數(shù) CURRENT_DATE //返回當(dāng)前日期(這是數(shù)據(jù)庫端的時(shí)間) CURRENT_TIME //返回當(dāng)前時(shí)間 CURRENT_TIMESTAMP //返回當(dāng)前日期時(shí)間 數(shù)學(xué)函數(shù) ABS(number) //絕對值 SQRT(number) //平方根 MOD(num,div)//取模 SIZE(collection) //返回集合中元素的數(shù)量 如:select o from Order o where size(o.items)>10 使用子查詢 xxxx in(子查詢) xxxx not in(子查詢) exists(子查詢) not exists(子查詢 ) exists存在的意思 即子查詢的結(jié)果不為空就是存在 分頁查詢 用到了query接口的兩個(gè)方法 setMaxResults(int) //設(shè)置獲取多少條記錄 和setFirstResult(int)//結(jié)果集開始的索引,索引默認(rèn)從0開始 以上兩個(gè)方法都返回Query對象所以可以組成方法鏈 query.setMaxResults(max).setFirstResult(index).getResultList() 批量操作(批量更新和批量刪除) 建議將所有批量操作與不連續(xù)的事務(wù)隔離開, 批量操作可能造成受管實(shí)體與數(shù)據(jù)庫的不一致 原生SQL查詢與調(diào)用存儲過程(EJB3.0不支持以O(shè)UT參數(shù)的形式返回的存儲過程) Query query=entityManager.createNativeQuery(" {call pro_1(?)} "); query.setParameter(1,"jsun"); //無返回值存儲過程 query.executeUpdate(); //返回單個(gè)值的存儲過程 String result=(String)query.getSingleResult(); //返回全部列的存儲過程 List<User> results=(List<User>)query.getResultList(); //返回部分列的存儲過程 List<Object[]> results=(List<Object[]>)query.getResultList(); for(Object[] row:results){ row[0],row[1] } |
|
|