Hibernate中的JPA 2.1条件删除/更新和临时表

从JPA 2.0版开始, EntityManager提供了方法getCriteriaBuilder()来动态构建选择查询,而无需使用Java持久性查询语言(JPQL)进行字符串连接。 在2.1版中,此CriteriaBuilder提供了两个新方法createCriteriaDelete()createCriteriaUpdate() ,使我们可以使用条件API制定删除和更新查询的方法。

出于说明目的,让我们对两个实体PersonGeek使用简单的继承用例:

@Entity
@Table(name = "T_PERSON")
@Inheritance(strategy = InheritanceType.JOINED)
public class Person {@Id@GeneratedValueprivate Long id;@Column(name = "FIRST_NAME")private String firstName;@Column(name = "LAST_NAME")private String lastName;...
}@Entity
@Table(name = "T_GEEK")
@Access(AccessType.PROPERTY)
public class Geek extends Person {private String favouriteProgrammingLanguage;...
}

要从我们的数据库中删除所有喜欢Java作为其编程语言的怪胎,我们可以使用EntityManager的新createCriteriaDelete()方法利用以下代码:

EntityTransaction transaction = null;
try {transaction = entityManager.getTransaction();transaction.begin();CriteriaBuilder builder = entityManager.getCriteriaBuilder();CriteriaDelete<Geek> delete = builder.createCriteriaDelete(Geek.class);Root<Geek> geekRoot = delete.from(Geek.class);delete.where(builder.equal(geekRoot.get("favouriteProgrammingLanguage"), "Java"));int numberOfRowsUpdated = entityManager.createQuery(delete).executeUpdate();LOGGER.info("Deleted " + numberOfRowsUpdated + " rows.");transaction.commit();
} catch (Exception e) {if (transaction != null && transaction.isActive()) {transaction.rollback();}
}

与纯SQL一样,我们可以使用from()方法指定要针对其发出删除查询的表,并使用where()声明谓词。 通过这种方式,标准API允许以动态方式定义批量删除操作,而无需使用过多的字符串连接。

但是,SQL是如何创建的呢? 首先,ORM提供程序必须注意,我们正在使用策略JOINED从继承层次结构中删除,这意味着我们有两个表T_PERSONT_GEEK ,其中第二个表存储对父表的引用。 Hibernate版本4.3.8.Final创建以下SQL语句:

insert 
intoHT_T_GEEKselectgeek0_.id as id fromT_GEEK geek0_ inner joinT_PERSON geek0_1_ on geek0_.id=geek0_1_.id wheregeek0_.FAV_PROG_LANG=?;delete 
fromT_GEEK 
where(id) IN (selectid fromHT_T_GEEK);delete 
fromT_PERSON 
where(id) IN (selectid fromHT_T_GEEK)delete 
fromHT_T_GEEK;

如我们所见,Hibernate使用与我们的搜索条件匹配的极客/人员的ID填充了一个临时表。 然后,它将删除极客表中的所有行,然后删除人员表中的所有行。 最后,临时表被清除。

删除语句的顺序很明确,因为表T_GEEKT_PERSON表的id列上具有外键约束。 因此,子表中的行必须在父表中的行之前删除。 本文介绍了Hibernate创建临时表的原因。 概括起来,潜在的问题是查询限制了仅在子表中存在的列上要删除的行。 但是子表中的行必须在父表中的相应行之前删除。 删除子表中的行(即,所有具有FAV_PROG_LANG='Java'的怪胎)后,由于已经删除了怪胎行,因此无法随后删除所有对应的人员。 解决该问题的方法是临时表,该临时表首先收集应删除的所有行ID。 知道所有ID后,可以使用此信息先从怪胎表中删除行,然后从人员表中删除行。

上面生成的SQL语句当然独立于标准API的用法。 使用JPQL方法会导致生成相同的SQL:

EntityTransaction transaction = null;
try {transaction = entityManager.getTransaction();transaction.begin();int update = entityManager.createQuery("delete from Geek g where g.favouriteProgrammingLanguage = :lang").setParameter("lang", "Java").executeUpdate();LOGGER.info("Deleted " + update + " rows.");transaction.commit();
} catch (Exception e) {if (transaction != null && transaction.isActive()) {transaction.rollback();}
}

当我们将继承策略从JOINED更改为SINGLE_TABLE ,生成的SQL语句也更改为单个(此处的鉴别DTYPE列为DTYPE ):

delete 
fromT_PERSON 
whereDTYPE='Geek' and FAV_PROG_LANG=?

结论

用于删除和更新的标准API的新增功能使您可以构造SQL语句,而无需任何字符串连接。 但是请注意,从继承层次结构中进行批量删除可能会迫使基础ORM使用临时表,以便组装必须事先删除的行列表。

翻译自: https://www.javacodegeeks.com/2015/02/jpa-2-1-criteria-deleteupdate-temporary-tables-hibernate.html

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

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

相关文章

使用Hamcrest增强JUnit的测试能力

package com.jadyer.service;import java.util.HashMap; import java.util.Map;import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Test;/*** 使用Hamcrest增强JUnit的测试能力* see Hamcrest框架提供了一些相对通俗并高效的方法来进行一些junit比较困…

在Websphere 8.0上安装Liferay 6.2 Enterprise Edition

为Liferay准备Websphere 当应用服务器二进制文件均已安装完毕&#xff0c;启动WebSphere应用服务器&#xff08;WAS&#xff09; 配置文件管理工具来创建一个配置文件适用于Liferay的和遵循的指示说明这里正式Liferay的文档。 这些说明用于在Websphere 8.5上安装Liferay 6.2&am…

java完数流程图_编程基本功训练:流程图画法及练习

对于“程序设计”的工作&#xff0c;许多初学者的理解就是“写代码”。同样&#xff0c;新手们苦恼的问题是&#xff0c;他们只会“写代码”。当接到一个新的任务&#xff0c;不少人总是在第一时间就爬到键盘上去敲代码。敲着敲着&#xff0c;就把自己绕糊涂了。头晕脑胀地坚持…

iOS modal view的关闭和显示问题

今天遇到一个问题&#xff1a; 需要关闭当前modal view&#xff0c;再present另一个modal view。 如果这么写&#xff1a; [self dismissModalViewControllerAnimated:NO];[self.delegate showBorderDetectionView];执行了第一句&#xff0c;再执行第二句的时候&#xff0c;sel…

西工大java高级网络编程_奥鹏西工大16春《JAVA高级网络编程》平时作业

西工大16春《JV高级网络编程》平时作业一、单选题(共 25 道试题&#xff0c;共 100 分。)1. 假设以tomt为w服务器&#xff0c;在hllopp应用中有一个hllo.jsp&#xff0c;它的文件路径如下: %TOMT_HOM%/wpps/hllopp/hllo/hllo.jsp 那么在浏览器端访问hllo.jsp的URL是()。. http:…

c#导出Excel

问题&#xff1a;用户查询一些数据&#xff0c;需要对页面上的数据生成excel文件。 分析&#xff1a;写文件&#xff0c;用excel进程&#xff0c;或者使用response方法&#xff08;都是通过网上查资料&#xff0c;个人就理解成这两个&#xff09; 使用excel进程有一个确定&…

使用Java 8流遍历递归数据结构

Streams API是Java 8中的真正瑰宝&#xff0c;我一直在为它们寻找或多或少的意外用途。 我最近写过有关将它们用作ForkJoinPool门面的文章 。 这是另一个有趣的例子&#xff1a;遍历递归数据结构。 事不宜迟&#xff0c;请看一下代码&#xff1a; class Tree {private int va…

mysql把用户权限授予新用户_MySQL新建普通用户和库并授予新用户对新库的所有权限...

新建库新建cmf和amon两个库&#xff0c;并指定默认字符集mysql> create database cmf DEFAULT CHARACTER SET utf8;Query OK, 1 row affected (0.00 sec)mysql> create database amon DEFAULT CHARACTER SET utf8;Query OK, 1 row affected (0.00 sec)新建用户新建cmf和a…

快速入门:OpenShift上的Spring Boot和WildfFly 8.2

与Spring Boot&#xff0c;WildFly和OpenShift相比&#xff0c;这是真正的“快速入门”&#xff0c;与我上一篇更具描述性的文章相反。 先决条件 在开始构建应用程序之前&#xff0c;我们需要安装一个OpenShift免费帐户和客户端工具。 步骤1&#xff1a;建立WildFly应用程式 …

java开发环境搭建 pdf_01搭建java web开发环境.pdf

01搭建java web开发环境.pdf还剩19页未读&#xff0c;继续阅读下载文档到电脑&#xff0c;马上远离加班熬夜&#xff01;亲&#xff0c;很抱歉&#xff0c;此页已超出免费预览范围啦&#xff01;如果喜欢就下载吧&#xff0c;价低环保&#xff01;内容要点&#xff1a;( 7)在 M…

linux培训笔记1

第五章 文件和目录的管理 linux命令的基本格式 #命令 [选项] [参数] 1、linux下的常用命令 (1)ls 查看(列出)目录下的内容 -l 查看文件详细信息 drwxr-xr-x. 23 root root 4096 5月 31 15:06 var 文件类型和…

Java 8 Optional不仅用于替换空值

总览 在Java 8中&#xff0c;您可以返回Optional而不是返回null。 就像您在Java 7中所做的那样。这取决于您是否倾向于忘记检查null还是使用静态代码分析检查对nullalbe的引用&#xff0c;这可能有很大的不同。 但是&#xff0c;还有一种更引人注目的情况是将Optional视为具有…

WCF学习笔记之序列化

DataContractAttribute 与 DataMenberAttribute DataContractAttribute该特性只能用于枚举、类和结构体&#xff0c;而不能用于接口&#xff1b;又因为DataContractAttribute是不可以被继承的&#xff0c;所以要所有作为数据契约的类型自身必须有这么一个特性&#xff1b;而且一…

转载[POJ题型分类]

北大ACM题分类 主流算法&#xff1a; 1.搜索 //回溯 2.DP&#xff08;动态规划&#xff09;  3.贪心  4.图论 //Dijkstra、最小生成树、网络流 5.数论 //解模线性方程 6.计算几何 //凸壳、同等安置矩形的并的面积与周长 7.组合数学 //Polya定理 8.模拟  9.数据结构 //…

在AWS Elastic MapReduce上运行PageRank Hadoop作业

在上一篇文章中&#xff0c;我描述了执行PageRank计算的示例&#xff0c;该示例是使用Apache Hadoop进行Mining Massive Dataset课程的一部分。 在那篇文章中&#xff0c;我接受了Java中现有的Hadoop作业&#xff0c;并做了一些修改&#xff08;添加了单元测试&#xff0c;并通…

java sort 第二个参数_详解java Collections.sort的两种用法

Collections是一个工具类&#xff0c;sort是其中的静态方法&#xff0c;是用来对List类型进行排序的&#xff0c;它有两种参数形式&#xff1a;public static > void sort(List list) {list.sort(null);}public static void sort(List list, Comparator super T> c) {lis…

MVC3 中使用Unity实现依赖注入

前言&#xff1a;前段时间一直在研究依赖注入&#xff0c;不过不是在MVC框架中使用&#xff0c;今天突然想到在MVC中使用Unity实现依赖注入&#xff0c;一时慌了&#xff0c;不知道从何下手&#xff0c;接着就是网上不停的找资料&#xff0c;下面我把我找到的资料分享下&#x…

避免在ConcurrentHashMap.computeIfAbsent()中进行递归

有时我们会提供糟糕的建议。 就像该文章中有关如何将Java 8用于缓存的功能性方法来计算斐波那契数的文章一样 。 正如我们的读者之一马蒂亚斯&#xff08;Matthias&#xff09;在评论中注意到的那样 &#xff0c;提出的算法可能永远不会停止。 考虑以下程序&#xff1a; publi…

java调用wvsc.exe_c语言 函数的调用方法

欢迎加入编程爱好者 QQ群 群号 57616770中都只有一个主函数main()&#xff0c;但实用程序往往由多个函数组成。函数是&#xff23;源程序的基本模块&#xff0c;通过对函数模块的调在第一章中已经介绍过&#xff0c;&#xff23;源程序是由函数组成的。虽然在前面各章的程序用实…

ms2005 SQL Server设置改为SQL Server身份验证

1.为 SQL Server 2005 Express Edition 或 SQL Server 2005 Developer Edition 启用远程连接 必须为要从远程计算机连接到的每个 SQL Server 2005 实例启用远程连接。为此&#xff0c;请按照下列步骤操作&#xff1a; 1.单击“开始”&#xff0c;依次指向“程序”、“Microsoft…