日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

终极JPA查询和技巧列表–第3部分

發(fā)布時(shí)間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 终极JPA查询和技巧列表–第3部分 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在閱讀第三部分之前,請(qǐng)記住本系列的第一部分和第二部分

JPA:通過查詢創(chuàng)建對(duì)象

JPA允許我們?cè)诓樵儍?nèi)創(chuàng)建對(duì)象,并帶有所需的值:

package com.model;public class PersonDogAmountReport {private int dogAmount;private Person person;public PersonDogAmountReport(Person person, int dogAmount) {this.person = person;this.dogAmount = dogAmount;}public int getDogAmount() {return dogAmount;}public void setDogAmount(int dogAmount) {this.dogAmount = dogAmount;}public Person getPerson() {return person;}public void setPerson(Person person) {this.person = person;} }package com.main;import java.util.List;import javax.persistence.EntityManager; import javax.persistence.Query;import com.model.PersonDogAmountReport;public class Page13 {@SuppressWarnings('unchecked')public static void main(String[] args) {CodeGenerator.startConnection();CodeGenerator.generateData();EntityManager em = CodeGenerator.getEntityManager();Query query = em.createQuery('select new com.model.PersonDogAmountReport(p, size(p.dogs)) from Person p group by p.id');List<PersonDogAmountReport> persons = query.getResultList();for (PersonDogAmountReport personReport : persons) {System.out.println(personReport.getPerson().getName() + ' has: ' + personReport.getDogAmount() + ' dogs.');}CodeGenerator.closeConnection();} }

注意,在查詢中我們創(chuàng)建了一個(gè)新對(duì)象。 好消息是您可以創(chuàng)建任何對(duì)象,而不必是一個(gè)實(shí)體。 您只需要傳遞類的完整路徑,JPA將處理新的類實(shí)例化。

對(duì)于需要特定字段但實(shí)體中不存在這些字段的報(bào)表,這是非常有用的功能。

JPQL:批量更新和刪除

有時(shí)我們需要執(zhí)行一個(gè)操作來更新表數(shù)據(jù)庫中的幾行。 例如,更新所有年齡大于70歲的人,并將其定義為老年人。

您可以像這樣運(yùn)行批量更新/刪除:

package com.main;import javax.persistence.EntityManager; import javax.persistence.Query;import com.model.Person;public class Page14 {public static void main(String[] args) {CodeGenerator.startConnection();CodeGenerator.generateData();EntityManager em = CodeGenerator.getEntityManager();em.clear();Query query = em.createQuery('update Person p set p.name = 'Fluffy, the destroyer of worlds!'');query.executeUpdate();query = em.createQuery('select p from Person p where p.id = 4');Person person = (Person) query.getSingleResult();System.out.println('My new name is: ' + person.getName());query = em.createQuery('delete from Person p where p.dogs is empty');query.executeUpdate();query = em.createQuery('select p from Person p');System.out.println('We had 6, but was found ' + query.getResultList().size() + ' persons in the database');CodeGenerator.closeConnection();} }

在這種情況下,級(jí)聯(lián)選項(xiàng)不會(huì)被觸發(fā)。 您將無法刪除對(duì)象,并希望JPA刪除關(guān)系中的級(jí)聯(lián)對(duì)象。 一旦討論批量操作,數(shù)據(jù)庫數(shù)據(jù)的完整性就屬于開發(fā)人員。 如果要從數(shù)據(jù)庫及其關(guān)系中刪除對(duì)象,則需要在執(zhí)行刪除操作之前將對(duì)象的關(guān)系更新為null。

我們可以將這種操作定義為非常危險(xiǎn)的操作。 如果我們?cè)诘?7行添加注釋(“ em.clear(); “),我們將看到該人的姓名在更新后仍然保持不變。

“ 問題 ”是持久性上下文將所有數(shù)據(jù)“ 附加 ”在內(nèi)存中,但是這些批量操作不會(huì)更新持久性上下文。 我們將在數(shù)據(jù)庫中完成一個(gè)操作,但尚未在持久性上下文中反映出來。 這種情況可能會(huì)給我們帶來同步問題。

描繪以下場(chǎng)景:

  • 事務(wù)開始。
  • 通過方法em.persist()將人員A保留在數(shù)據(jù)庫中。
  • 人B的名稱通過em.merge()方法更新為“ Louanne”。
  • 人員A將通過批量刪除操作被刪除。
  • 人B的名稱已通過批量更新更新為“ Fernanda”。
  • 交易完成。

在這種情況下會(huì)發(fā)生什么? 人員A已被批量操作刪除,但是持久性上下文將嘗試將其持久化到數(shù)據(jù)庫中。 人員B的名稱已更新為Fernanda,但“持久性上下文”將嘗試更新為Louanne。

對(duì)于某種情況,沒有默認(rèn)行為,但是可以使用一些解決方案來避免這些問題:

  • 在批量操作之前啟動(dòng)新事務(wù):對(duì)于剛開始于批量操作的新事務(wù),此操作完成后,更新/刪除將在數(shù)據(jù)庫中執(zhí)行。 您將沒有實(shí)體管理器嘗試使用尚未寫入數(shù)據(jù)庫的數(shù)據(jù)。
  • 在批量操作之前調(diào)用“ entityManager.clear()”方法:如果調(diào)用此方法,則將強(qiáng)制“持久性上下文”釋放所有緩存的數(shù)據(jù)。 批量操作后,如果您使用find方法,則持久性上下文將從數(shù)據(jù)庫中獲取數(shù)據(jù),因?yàn)槟谂坎僮髦扒宄司彺娴臄?shù)據(jù)。

調(diào)用clear()方法不是靈丹妙藥,如果多次使用它會(huì)給您帶來性能問題。 如果您的Persistence Context有很多緩存的對(duì)象,并且您調(diào)用clear()方法,則Persistence Context將必須執(zhí)行很多“行程”才能再次獲取所需的數(shù)據(jù)。 持久性上下文具有出色的數(shù)據(jù)緩存控件,應(yīng)該利用它。

批量操作是一種可以在多種情況下為我們提供幫助的選項(xiàng), 但是您必須謹(jǐn)慎使用它。

JPA:條件

JPA是運(yùn)行查詢的一個(gè)很好的框架,但是Criteria并不是使用JPA進(jìn)行查詢的一個(gè)好方法。

JPA標(biāo)準(zhǔn)過于冗長,復(fù)雜,并且需要太多代碼才能進(jìn)行一些基本查詢。 不幸的是,作為休眠標(biāo)準(zhǔn)并不容易。

下面的代碼將顯示一個(gè)簡單的Criteria代碼,但我們不會(huì)再看到更多有關(guān)此主題的信息。 我已經(jīng)讀了三本關(guān)于EJB / JPA的書,而沒有一本書談?wù)撍?

下面的代碼有一個(gè)標(biāo)準(zhǔn)代碼:

package com.main;import java.util.List;import javax.persistence.EntityManager; import javax.persistence.criteria.CriteriaQuery;import com.model.Person;public class Page15 {@SuppressWarnings({ 'unchecked', 'rawtypes' })public static void main(String[] args) {CodeGenerator.startConnection();CodeGenerator.generateData();EntityManager em = CodeGenerator.getEntityManager();CriteriaQuery criteriaQuery = em.getCriteriaBuilder().createQuery();criteriaQuery.select(criteriaQuery.from(Person.class));List<Person> result = em.createQuery(criteriaQuery).getResultList();System.out.println('Found ' + result.size() + ' persons.');CodeGenerator.closeConnection();} }

我很遺憾在這里這樣說我對(duì)Criteria的看法,但是到目前為止,除非對(duì)于ListALL,否則在您的代碼中使用Criteria并不容易。

上面的代碼很容易應(yīng)用于通用DAO,因此通過它列出所有對(duì)象會(huì)更容易。

以下鏈接顯示了應(yīng)用程序中的通用DAO: 完整WebApplication JSF EJB JPA JAAS 。

結(jié)束!

希望這篇文章對(duì)您有所幫助。

單擊此處下載源代碼。

您無需編輯任何配置即可運(yùn)行本文的代碼,只需將其導(dǎo)入Eclipse。

如果您有任何疑問/意見,請(qǐng)?jiān)谙旅鎸⑵浒l(fā)布。

再見。

有用的鏈接:

  • http://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-log4j/
  • http://stackoverflow.com/questions/1659030/how-to-get-the-database-time-with-jpql
  • Pro EJB 3:Java持久性API,Mike Keith,Merrick Schincariol
  • 企業(yè)JavaBeans 3.0 – Richard Monson-Haefel,Bill Burke

參考: uaiHebert博客上來自JCG合作伙伴 Hebert Coelho的JPA查詢和技巧 。


翻譯自: https://www.javacodegeeks.com/2012/07/ultimate-jpa-queries-and-tips-list-part_7092.html

總結(jié)

以上是生活随笔為你收集整理的终极JPA查询和技巧列表–第3部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。