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

jpa 查询 列表

在阅读第三部分之前,请记住本系列的第一部分和第二部分

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标准过于冗长,复杂,并且需要太多代码才能进行一些基本查询。 不幸的是,作为Hibernate标准并不容易。

下面的代码将显示一个简单的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的看法,但是到目前为止,除非对于A 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

jpa 查询 列表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 限制文件大小_java上传文件大小限制

win系统下解决ASP上传文件大小限制200K_电脑基础知识_IT/计算机_专业资料。win系统下解决ASP上传文件大小限制200K 解决ASP 上传文件大小限制 200K win2003 系统下的 ......介绍 上传 // 新建一个 SmartUpload 对象 SmartUpload su new SmartUpload(); // 上传初始化 su.initi…

java 数组的get set_java.lang.reflect.Array.setBoolean()方法

java.lang.reflect.Array.setBoolean(Object array, int index, boolean value)方法将指定的数组对象的索引组件的值设置为指定的布尔值。声明以下是java.lang.reflect.Array.set(Object array, int index, boolean value)方法的声明。public static void setBoolean(Object ar…

poj3984 迷宫问题 bfs 最短路 广搜

迷宫问题Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 27913 Accepted: 16091Description定义一个二维数组&#xff1a; int maze[5][5] {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};它表示一个迷宫&#xff0c;其中的1表示墙壁…

使用JBoss Fuse和OpenShift进行Cloud Native Camel骑行

红帽公司最近发布了一个微服务集成工具包&#xff0c;用于在OpenShift v3的Docker和Kubernetes环境中运行我们的微服务。 为了帮助人们更好地理解这一点&#xff0c;我将Rider Auto应用程序迁移到一组微服务中&#xff0c;该应用程序已经存在了一段时间&#xff0c;该应用程序用…

python之字符串连接

join 就属于技巧了&#xff0c;利用字符串的函数 join 。这个函数接受一个列表&#xff0c;然后用字符串依次连接列表中每一个元素&#xff1a; str_list [Pyt, hon] a print a.join(str_list)步骤&#xff1a; 1、建立一个列表 2、利用 join() 原文链接  转载于:https://…

JAVA取钱多线程实验_JAVA多线程----用--取钱问题2

在该示例代码中&#xff0c;TestAccount类是测试类&#xff0c;主要实现创建帐户Account类的对象&#xff0c;以及启动学生线程StudentThread和启动家长线程GenearchThread。在StudentThread线程中&#xff0c;执行的功能是每隔2秒中取一次钱&#xff0c;每次取50元。在Genearc…

Spark1——介绍

1、Spark是什么 Spark是一个用来实现快速而通用的集群计算的平台。 2、Spark是一个大一统的软件栈 Spark项目包含多个紧密集成的组件。首先Spark的核心是一个对由很多计算任务组成的、运行在多个工作机器或者是一个计算集群上的应用进行调度、分发以及监控的计算引擎。 Spark的…

java按输入顺序输出_java 输入3个数a,b,c,按大小顺序输出的实例讲解

java 输入3个数a,b,c&#xff0c;按大小顺序输出的实例讲解题目&#xff1a;输入3个数a,b,c&#xff0c;按大小顺序输出。代码&#xff1a;import java.util.Scanner;public class lianxi34 {public static void main(String[] args) {Scanner s new Scanner(System.in);Syste…

Java 8中HotSpot选项的改进文档

Oracle的 Java 8 的HotSpot实现中引入的一些小但受欢迎的功能之一是在启动器的文档中添加了许多常见的HotSpot Java启动器 &#xff08; java &#xff09;选项/标志。 过去&#xff0c;即使是对某些相当常见的HotSpot JVM选项也感兴趣的开发人员 &#xff0c;不得不潜在地寻找…

sql server数据库课程设计分析

课题&#xff1a;能源管理收费系统 系统功能的基本要求&#xff1a; &#xff08;1&#xff09;用户基本信息的录入&#xff1a;包括用户的单位、部门、姓名、联系电话、住址 &#xff1b; &#xff08;2&#xff09;用户水、电、气数据的录入&#xff08;每个月的数据的录入&a…

Springboot 项目启动后执行某些自定义代码

Springboot 项目启动后执行某些自定义代码 Springboot给我们提供了两种“开机启动”某些方法的方式&#xff1a;ApplicationRunner和CommandLineRunner。这两种方法提供的目的是为了满足&#xff0c;在项目启动的时候立刻执行某些方法。我们可以通过实现ApplicationRunner和Com…

android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...

Android中的传递有两个方法&#xff0c;一个是Serializable&#xff0c;另一个是Parcelable。Serializable是J2SE本身就支持的。而Parcelable是Android所特有的。二者的使用场景和区别&#xff1a;1)在使用内存的时候&#xff0c;Parcelable比Serializable性能高&#xff0c;所…

[BZOJ4537][Hnoi2016]最小公倍数 奇怪的分块+可撤销并查集

4537: [Hnoi2016]最小公倍数 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1474 Solved: 521[Submit][Status][Discuss]Description 给定一张N个顶点M条边的无向图(顶点编号为1,2,…,n)&#xff0c;每条边上带有权值。所有权值都可以分解成2^a*3^b的形式。现在有q个询问&…

全新资源素材站源码 功能齐备 界面干净整洁

源码介绍 简单安装说明&#xff1a; 1、整站程序上传后台 2、然后导入数据库文件到数据库&#xff0c; 3、修改conf里面的conf的数据库名字及密码 4、配置伪静态 规则&#xff1a; location ~* \.(htm)$ { rewrite "^(.*)/(.?).htm(.*?)$" $1/index.php?$2…

jBPM和Drools工作台中的用户和组管理

介绍 本文讨论了一项新功能&#xff0c;该功能允许使用集成在jBPM和Drools Workbenches中的直观友好的用户界面来管理应用程序的用户和组。 用户和组管理 在安装&#xff0c;设置和使用此功能之前&#xff0c;本文讨论了一些以前的概念&#xff0c;需要进一步理解才能进一步使…

java懒加载设计模式_java设计模式——单例模式

整理一下设计模式的个人理解。描述单例模式是java中比较常见的一种设计模式&#xff0c;顾名思义为一个类只能创建一个实例&#xff0c;多用于全局对象&#xff0c;如&#xff1a;配置的加载&#xff0c;spring bean加载各种配置(spring容器所有bean默认都是单例)单例的特点为构…

BZOJ.4553.[HEOI2016TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

题目链接&#xff1a;BZOJ 洛谷\(O(n^2)\)DP很好写&#xff0c;对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]d[j]1\) for(int j1; j<i; j)if(a[j]<minv[i]&&maxv[j]<a[i])//序列只会变换一次 dp[i]max{dp[j]1}; 转移要满足两个条件&#xff1a;\(a[j]…

java 快速构建ssm项目_SSM快速搭建

基本环境搭建1、 创建Maven工程2、 导入项目相关依赖的jar包springspringmvcmybatismysqljunitspring-testlombokdevtoolsxmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org…

jpa 查询 列表_终极JPA查询和技巧列表–第2部分

jpa 查询 列表这一部分是该系列文章的第一部分 。 JPA&#xff1a;NamedQuery&#xff0c;使用日期查询&#xff0c;有关getSingleResult方法的警告 为了避免重复查询代码&#xff0c;提高性能并简化维护查询&#xff0c;我们可以使用NamedQueries。 NamedQuery使用JPQL作为语…

IE针对Ajax请求结果的缓存IE浏览器同一个请求第二次是缓存数据不刷新

IE针对Ajax请求结果的缓存IE浏览器同一个请求第二次是缓存数据不刷新 IE针对Ajax请求结果的缓存/ IE浏览器同一个请求第二次是缓存 一.在AJAX请求的属性上直接设置cache function getSetServer (selectIDs) {$.ajax({url:/kl_eas/v1/monitor/servers? new Date().toTimeString…