終極JPA查詢和技巧列表–第3部分

在閱讀第三部分之前,請記住本系列的第一部分和第二部分

JPA:通過查詢創建對象

JPA允許我們在查詢內創建對象,并帶有所需的值:

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();}
}

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

對于需要特定字段但實體中不存在這些字段的報表,這是非常有用的功能。

JPQL:批量更新和刪除

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

您可以像這樣運行批量更新/刪除:

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();}
}

在這種情況下,級聯選項不會被觸發。 您將無法刪除對象,并希望JPA刪除關系中的級聯對象。 一旦討論批量操作,數據庫數據的完整性就屬于開發人員。 如果要從數據庫及其關系中刪除對象,則需要在執行刪除操作之前將對象的關系更新為null。

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

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

描繪以下場景:

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

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

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

  • 在批量操作之前啟動新事務:對于剛開始于批量操作的新事務,此操作完成后,更新/刪除將在數據庫中執行。 您將沒有實體管理器嘗試使用尚未寫入數據庫的數據。
  • 在批量操作之前調用“ entityManager.clear()”方法:如果調用此方法,則將強制“持久性上下文”釋放所有緩存的數據。 批量操作后,如果您使用find方法,則持久性上下文將從數據庫中獲取數據,因為您在批量操作之前清除了緩存的數據。

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

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

JPA:條件

JPA是運行查詢的一個很好的框架,但是Criteria并不是使用JPA進行查詢的一個好方法。

JPA標準過于冗長,復雜,并且需要太多代碼才能進行一些基本查詢。 不幸的是,作為休眠標準并不容易。

下面的代碼將顯示一個簡單的Criteria代碼,但我們不會再看到更多有關此主題的信息。 我已經讀了三本關于EJB / JPA的書,而沒有一本書談論它。

下面的代碼有一個標準代碼:

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();}
}

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

上面的代碼很容易應用于通用DAO,因此通過它列出所有對象會更容易。

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

結束!

希望這篇文章對您有所幫助。

單擊此處下載源代碼。

您無需編輯任何配置即可運行本文的代碼,只需將其導入Eclipse。

如果您有任何疑問/意見,請在下面將其發布。

再見。

有用的鏈接:

  • 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
  • 企業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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371740.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371740.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371740.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分治1--二分查找

分治1--二分查找 一、心得 二、題目和分析 三、代碼和結果 1 #include <iostream>2 using namespace std;3 int a[10]{1,2,4,5,7,8,9,10,13,20};4 5 6 //非遞歸 7 int find(int i){8 int l0,r9;9 int mid(lr)/2; 10 while(l<r){ 11 mid(lr)/2; 12…

隱式意圖啟動一個Activity

隱式意圖是通過指定一組動作或者屬性實現&#xff0c;主要用于跨應用使用。 1.創建一個意圖對象 Intent intent new Intent();2.設置意圖過濾器 intent.setAction("android.intent.action.testActivity"); //對應于action intent.addCategory("android.intent.…

Spring自定義命名空間

Spring自定義命名空間提供了一種很好的方式來簡化用于描述Spring應用程序上下文的bean定義的xml文件。 這是一個相當古老的概念&#xff0c;最初是在Spring 2.0中引入的&#xff0c;但值得不時地進行審查。 考慮一種情況&#xff0c;必須為沒有自定義名稱空間的Spring MVC應用程…

java二叉樹代碼_JAVA語言實現二叉樹生成的代碼教程

本文主要向大家介紹了JAVA語言實現二叉樹生成的代碼教程&#xff0c;通過具體的內容向大家展示&#xff0c;希望對大家學習JAVA語言有所幫助。給定某二叉樹三序遍歷中的兩個&#xff0c;我們即可以通過生成該二叉樹&#xff0c;并遍歷的方法&#xff0c;求出剩下的一序&#xf…

一個回到頂部的錨點

一般網站的右下角都會有一個回到頂部的錨點&#xff0c;但是在沒有學bootstrap的時候&#xff0c;我還是會想著用定位來做這個東西&#xff0c;但是現在用bootstrap來做的&#xff0c;所以將它記錄下來。 <!DOCTYPE html><html> <head><title>附加導航…

jquery jgrid filterToolBar beforeSearch 修改postData

beforeSearch: function() { var posted_data $("#mygrid").jqGrid(getGridParam,postData); posted_data ["testp"]"helloTest"; }轉載于:https://www.cnblogs.com/qiumingcheng/p/7141671.html

預告片:裸指關節SOA

我正在研究這個想法&#xff0c;但我不知道它是否對你們有吸引力。 我想就您是否需要進一步探討提出您的意見。 達成協議&#xff1a;我遇到過一些團隊&#xff0c;他們在使用SOA技術時由于其工具的復雜性而陷入泥潭。 我只在Java中看到過這種情況&#xff0c;但是我從一些C&am…

網頁轉圖片 java_java-網頁轉圖片

對比了網上常用的好幾種網頁轉圖片的開源插件&#xff0c;最后效果還不如使用原生的java直接寫來得好&#xff0c;上代碼&#xff0c;很簡單&#xff0c;中間需要考慮網頁加載延遲的問題&#xff0c;所以需要加上thread.sleep&#xff0c;休眠一下等待網頁加載完成了&#xff0…

開一個新坑吧

每天讀讀日志 給自己動力 開個新坑&#xff08;外星殖民&#xff09; 無聊時寫一寫 轉載于:https://www.cnblogs.com/dandansang/p/7143489.html

JMX和Spring –第1部分

這是三篇文章的第一篇&#xff0c;這三篇文章將展示如何通過JMX支持為Spring應用程序賦能。 Maven配置 這是用于設置此示例代碼的Maven pom.xml&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSche…

maven exclude java_java – Maven:從shade插件中排除依賴項

我在mvn clean install之后看過下一個字符串Including com.sun.jersey.contribs:jersey-multipart:jar:1.5 in theshaded jar問題&#xff1a;即使我已經為maven-shade-plugin添加了exlusion,我也無法使它沒有陰影(參見下面的代碼)我的maven-shade-plugin&#xff1a;org.apach…

JMX和Spring –第3部分

本文是本系列的最后一篇。 看一下第1 部分和第2部分 。 在本系列的最后一篇文章中&#xff0c;我將展示如何在JDK中使用本機JMX支持來實現一種通知機制&#xff0c;該機制可以在HEAP內存超過特定閾值時向偵聽器發出警報。 正如我在上一篇文章中討論的那樣&#xff0c;這種方法…

QScrollArea不能顯示滾動條

轉載請注明出處&#xff1a;http://www.cnblogs.com/dachen408/p/7147141.html 問題&#xff1a;QScrollArea不能顯示滾動條 解決方案&#xff1a;設置QScrollArea->setWidgetResizeable&#xff08;false&#xff09;解決問題。 例子&#xff1a; ui.scrollArea->setWi…

java婚慶網站源碼_基于jsp的婚慶網站-JavaEE實現婚慶網站 - java項目源碼

基于jspservletpojomysql實現一個javaee/javaweb的婚慶網站, 該項目可用各類java課程設計大作業中, 婚慶網站的系統架構分為前后臺兩部分, 最終實現在線上進行婚慶網站各項功能,實現了諸如用戶管理, 登錄注冊, 權限管理等功能, 并實現對各類婚慶網站相關的實體進行管理。該婚慶…

JQuery實現的模塊交換動畫效果

<!doctype html> <html><head><meta http-equiv"content-type" content"text/html;charsetutf-8" /><title>JQuery實現的模塊交換動畫效果</title><meta name"Keywords" content"jquery&#xff0c…

CKD 實現

主要功能&#xff1a;1、新物料&#xff08;部品號&#xff09;的入庫管理 部品號的驗證、描述、品名、重量、單價等 2、部品號-供應商的核對 校驗部品號/供應商的對應情況、入庫、移除等 3、BOM清單的導入 基礎清單的導入 4、訂單 CKD套件管理 物料齊套管理 箱單管理 匯總 5、…

JMX和Spring –第2部分

這篇文章從本教程的第1部分繼續。 嗨&#xff0c;在我的前一篇文章中&#xff0c;我解釋了如何通過Spring設置JMX服務器以及如何通過身份驗證和授權保護對它的訪問。 在本文中&#xff0c;我將展示如何實現一個簡單的MBean&#xff0c;該MBean允許用戶在運行時更改Log4j記錄器…

android p wifi一直在掃描_(一百六十八)Android P wifi 掃描失敗結果上報流程梳理-掃描上報梳理②...

接(一百五十五)Android P wifi 掃描失敗結果上報流程梳理-掃描上報梳理 掃描失敗上報梳理發現梳理的差了很多&#xff0c;特補充1.WificondScannerImplOverridepublic boolean startSingleScan(WifiNative.ScanSettings settings,WifiNative.ScanEventHandler eventHandler) {i…

(五)什么是RDD-JavaPython版Spark

什么是RDD 視頻教程&#xff1a; 1、優酷 2、YouTube RDD是個抽象類&#xff0c;全稱為Resilient Distributed Datasets&#xff0c;是一個容錯的、并行的數據結構&#xff0c;可以讓用戶顯式地將數據存儲到磁盤和內存中&#xff0c;并能控制數據的分區。同時&#xff0c;RDD還…

LazyInitializationException的四種解決方案–第1部分

在今天的帖子中&#xff0c;我們將討論常見的LazyInitializationException錯誤。 我們將看到四種避免該錯誤的方法&#xff0c;以及每種方法的優缺點。在本文的最后&#xff0c;我們將討論EclipseLink如何處理該異常。 為了看到LazyInitializationException錯誤并進行處理&…