电竞比分网-中国电竞赛事及体育赛事平台

分享

JPQL

 killerwang249 2013-07-15

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]

}

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多