终极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.mzph.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错误并进行处理&…