jpa 实体图查询_JPA实体图

jpa 实体图查询

JPA 2.1的最新功能之一是可以使用实体图指定获取计划。 这很有用,因为它允许您自定义使用查询或查找操作检索的数据。 在使用中大型应用程序时,通常以不同的方式显示来自同一实体的数据。 在其他情况下,您只想选择最小的信息集即可优化应用程序的性能。

您没有很多机制可以控制JPA实体中加载或不加载的内容。 您可以使用EAGER / LAZY提取,但是这些定义几乎是静态的。 您在检索数据时无法更改其行为,这意味着您受制于实体中定义的内容。 在开发中更改这些内容是一场噩梦,因为这可能会导致查询行为异常。 控制加载的另一种方法是编写特定的JPQL查询。 通常,您最终会得到非常相似的查询和以下方法: findEntityWithXfindEntityWithYfindEntityWithXandY等。

在JPA 2.1之前,实现已经支持一种类似于实体图的非标准方式来加载数据。 您具有Hibernate Fetch配置文件 , OpenJPA Fetch组和EclipseLink Fetch组 。 在规范中具有这种行为是合乎逻辑的。 它允许您使用标准API对需要加载的内容进行更精细和详细的控制。

考虑以下实体图:

电影实体图

(关系应该是N到N,但让它保持简单)。

电影实体具有以下定义:

电影.java

@Entity
@Table(name = "MOVIE_ENTITY_GRAPH")
@NamedQueries({@NamedQuery(name = "Movie.findAll", query = "SELECT m FROM Movie m")
})
@NamedEntityGraphs({@NamedEntityGraph(name = "movieWithActors",attributeNodes = {@NamedAttributeNode("movieActors")}),@NamedEntityGraph(name = "movieWithActorsAndAwards",attributeNodes = {@NamedAttributeNode(value = "movieActors", subgraph = "movieActorsGraph")},subgraphs = {@NamedSubgraph(name = "movieActorsGraph",attributeNodes = {@NamedAttributeNode("movieActorAwards")})})
})
public class Movie implements Serializable {@Idprivate Integer id;@NotNull@Size(max = 50)private String name;@OneToMany@JoinColumn(name = "ID")private Set<MovieActor> movieActors;@OneToMany(fetch = FetchType.EAGER)@JoinColumn(name = "ID")private Set<MovieDirector> movieDirectors;@OneToMany@JoinColumn(name = "ID")private Set<MovieAward> movieAwards;
}

靠近实体,我们可以看到我们有3个1到N的关系,并且movieDirectors设置为Eagerly加载。 其他关系设置为默认的延迟加载策略。 如果要更改此行为,可以使用批注@NamedEntityGraph定义不同的加载模型。 只需设置一个名称即可识别它,然后使用@NamedAttributeNode指定要加载的根实体的哪些属性。 对于关系,您需要为子图设置一个名称,然后使用@NamedSubgraph 。 详细地:

注解

实体图movieWithActors

@NamedEntityGraph(name = "movieWithActors",attributeNodes = {@NamedAttributeNode("movieActors")}) )

这定义了一个名称为movieWithActors的实体图,并指定了应加载关系movieActors

实体图movieWithActorsAndAwards

@NamedEntityGraph(name = "movieWithActorsAndAwards",attributeNodes = {@NamedAttributeNode(value = "movieActors", subgraph = "movieActorsGraph")},subgraphs = {@NamedSubgraph(name = "movieActorsGraph",attributeNodes = {@NamedAttributeNode("movieActorAwards")})})

这将定义一个名称为movieWithActorsAndAwards的实体图,并指定应加载关系movieActors 。 此外,它还指定关系movieActors应该加载movieActorAwards

请注意,我们没有在实体图中指定id属性。 这是因为无论指定什么内容,总是会获取主键。 版本属性也是如此。

提示

要使用查询中定义的实体图,您需要将它们设置为提示。 您可以使用两个提示属性,它们也会影响数据的加载方式。

您可以使用javax.persistence.fetchgraph ,此提示会将Entity Graph中所有指定的属性视为FetchType.EAGER 。 未指定的属性被视为FetchType.LAZY

另一个属性提示是javax.persistence.loadgraph 。 这会将Entity Graph中所有指定的属性视为FetchType.EAGER 。 未指定的属性将被视为其指定的或默认的FetchType

为了简化,并基于我们的示例,当应用实体图movieWithActors

默认/指定 javax.persistence.fetchgraph javax.persistence.loadgraph
电影演员 急于 急于
电影导演 急于 急于
电影奖

从理论上讲,这应该是获取不同关系的方式。 实际上,它可能无法以这种方式工作,因为JPA 2.1规范还指出,JPA提供程序始终可以获取除实体图中指定的状态之外的其他状态。 这是因为提供程序可以优化要获取的数据并最终加载更多的数据。 您需要检查提供商的行为。 例如,即使使用javax.persistence.fetchgraph提示,Hibernate始终会获取指定为EAGER的所有内容。 在此处检查问题。

询问

执行查询很容易。 您可以setHint进行操作,但是只需对Query对象调用setHint

提示实体图

@PersistenceContextprivate EntityManager entityManager;public List<Movie> listMovies(String hint, String graphName) {return entityManager.createNamedQuery("Movie.findAll").setHint(hint, entityManager.getEntityGraph(graphName)).getResultList();}

要获取要在查询中使用的实体图,您需要在EntityManager上调用getEntityGraph方法并传递名称。 然后在提示中使用参考。 提示必须是javax.persistence.fetchgraphjavax.persistence.loadgraph

程式化

注释可能变得冗长,尤其是当您有大图或许多实体图时。 您可以以编程方式定义实体图,而不必使用注释。 让我们看看如何:

首先添加一个静态元模型实体类:

Movie_.java

@StaticMetamodel(Movie.class)
public abstract class Movie_ {public static volatile SingularAttribute<Movie, Integer> id;public static volatile SetAttribute<Movie, MovieAward> movieAwards;public static volatile SingularAttribute<Movie, String> name;public static volatile SetAttribute<Movie, MovieActor> movieActors;public static volatile SetAttribute<Movie, MovieDirector> movieDirectors;
}

确实不是必需的,您可以通过字符串名称来引用属性,但这将使您键入安全。

程序实体图

EntityGraph<Movie> fetchAll = entityManager.createEntityGraph(Movie.class);fetchAll.addSubgraph(Movie_.movieActors);fetchAll.addSubgraph(Movie_.movieDirectors);fetchAll.addSubgraph(Movie_.movieAwards);

该实体图指定必须加载该实体的所有关系。 现在,您可以调整自己的用例。

资源资源

您可以在Github的Java EE示例中找到此示例代码。 在这里检查。

特别说明: EclipseLink / Glassfish当前存在一个错误,该错误会阻止javax.persistence.loadgraph提示正常工作。 在此处检查问题。

结论

实体图填补了JPA规范中缺少的空白。 它们是一种额外的机制,可以帮助您查询真正需要的内容。 它们还可以帮助您提高应用程序的性能。 但是使用它们时要聪明。 可能有更好的方法。

翻译自: https://www.javacodegeeks.com/2014/11/jpa-entity-graphs.html

jpa 实体图查询

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

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

相关文章

C语言程序控制语句——while

while语句while &#xff08;表达式&#xff09; 语句当表达式为非0值&#xff08;真&#xff09;时&#xff0c;执行while循环体中的语句&#xff0c;如此往复&#xff0c;直到表达式的值等于0&#xff08;假&#xff09;&#xff0c;循环结束。如以下示例程序&#xff0c;循环…

kettle 资料_Kettle的使用-初级

本文从kettle的简介、下载、安装、初级使用来展开。1.kettle是什么&#xff1f;kettle是一款开源的ETL工具。可以运行在Windows和linux上。2.下载地址https://community.hitachivantara.com/s/article/downloads3.安装因为Kettle是基于Java开发的&#xff0c;所以要先安装jdk环…

python抢货程序_写个Python程序上下班抢个顺风单

#!/usr/bin/python# -*- coding: gb2312 -*-##########################################################################2015-12-11 09:47:46#author: 358275018qq.com#使用Python2.6/7######################################################################### 有些库没…

C语言 | 语句概述

C语言语句的作用和分类1、9种控制语句if&#xff08;&#xff09;...else.. //条件语句 for&#xff08;&#xff09;... //循环语句 while&#xff08;&#xff09;... //循环语句 do...while&#xff08;&#xff09; //循环语句 continue //结束本次循环语句 break //中止执…

react性能优化方案_React灵敏且性能卓越的Spray + Akka解决方案,以“在Java和Node.js中发挥并发性和性能”...

react性能优化方案在我以前的文章中&#xff0c;我研究了一个虚拟的交易引擎&#xff0c;并将基于Java的阻止解决方案与基于Node.js的非阻止解决方案进行了比较。 在文章的结尾&#xff0c;我写道&#xff1a; 我怀疑随着Node.js的最近成功&#xff0c;越来越多的异步Java库将…

linux 查看日志_干货 | 名企高频考点之谈谈Linux日志查看方式都有哪些

点击蓝字关注我哦以下是本期干货视频视频后还附有文字版本哦▼《名企高频考点-谈谈Linux日志查看方式都有哪些》▼ps&#xff1a;请在WiFi环境下打开&#xff0c;如果有钱任性请随意0.概述在我们面试各大公司的时候&#xff0c;关于Linux往往最容易问到的问题之一就是Linux指令…

vsm java_java – 我尝试使用JAXB将对象编组到xml文件中时,错误为“缺少@XmlRootElement注释”...

我是刚刚开始使用JAXB的人,所有我需要的是将对象写入xml并在某些时候将其读回java这是我的班级&#xff1a;public class VSM implements java.io.Externalizable{ArrayList termList; //Term DictionaryArrayList queryTermList; //Query listArrayList> docLists;ArrayLis…

jvm7 jvm8_自我修复的JVM

jvm7 jvm8这篇帖子是关于一个应用程序的示例&#xff0c;其中解决每个IT问题的第一个解决方案-“您是否尝试过将其关闭并重新打开”-可能适得其反&#xff0c;弊大于利。 我们不需要关闭电源&#xff0c;而是拥有可以自愈的应用程序&#xff1a;它在一开始就失败了&#xff0c…

实例讲解C语言的位运算

C语言位运算有6种&#xff1a; &&#xff0c; | , ^(异或)&#xff0c; <<(左移)&#xff0c;>>(右移)。注意&#xff1a;参与位运算的元素必须是int型或者char型&#xff0c;以补码形式出现。1.按位与&&运算常应用于&#xff1a;迅速清零保留指定位判…

python3解释器执行not 1 and 1_编程语言的分类,python解释器多版本共存.执行python的两种方式,变量,用户与程序交互...

一、编程语言的分类&#xff1f;机器语言&#xff1a;直接使用二进制指令编程&#xff0c;直接操作硬件&#xff0c;必须考虑硬件细节。汇编语言&#xff1a;用简写的英文标识符取代二进制去编写程序&#xff0c;直接操作硬件&#xff0c;必须考虑硬件细节。高级语言&#xff1…

java字节码执行原理_《Java 底层原理》Java 字节码详解

前言我们在开发中会遇到一些Java的执行超出我们的想象&#xff0c;但是又不知道他为什么会这样执行&#xff0c;这个时候我们就需要能够知道他编译后Class文件是什么样子的&#xff0c;并且理解字节码的含义。Java字节码的原理进制class文件就是字节码文件&#xff0c;直接是打…

C语言学习笔记--位运算

这一节主要说的是位运算&#xff0c;计算机中的执行速度&#xff1a;位运算 > 加减 > 乘除 > 求余位运算就是将数字转换成二进制后进行运算&#xff0c;之后再将数字转换成原来的进制与运算&#xff1a;当两个数相与时&#xff0c;只有都为l的时候结果才为1&#xff0…

openshift学习_在OpenShift上将JMS与JBoss A-MQ结合使用。 学习了有关远程客户端和加密的经验。...

openshift学习OpenShift是“红帽开发的开放式混合云应用程序平台”。 它具有不同的风格&#xff0c;对于大多数您想做的事情&#xff0c;最有趣的部分是公共云应用程序开发和托管平台“ OpenShift Online ”。 您可以轻松地尝试一下&#xff0c;因为在云中使用OpenShift Online…

mathtype运行时错误48_在office中无法使用MathType该怎么办?

想必大家都遇到过在office中无法使用MathType的情况&#xff0c;那么遇到这种情况的话大家应该怎么来解决呢&#xff1f;首先这样的现象一般为&#xff1a;word或者ppt中没有mathtype选项&#xff0c;或者选项打开提示文件未找到&#xff1a;MathPage.WLL。错误提示或者甚至运行…

谈谈C语言中的杂项运算符

在C语言中&#xff0c;还有一些重要的运算符&#xff0c;例如&#xff1a;sizeof()、&、* 、 ?: 。我们把上述的这些运算符归为杂项运算符&#xff0c;下面我将详细介绍这些杂项运算符。下面的表格列出了 C 语言支持的所有杂项运算符&#xff1a;运算符解释例子sizeof()返…

java集合的添加方法_深入理解java集合框架之---------Arraylist集合 -----添加方法

Arraylist集合 -----添加方法1、add(E e) 向集合中添加元素/*** 检查数组容量是否够用* param minCapacity*/public void ensureCapacity(int minCapacity){modCount;int oldCapacity elementData.length;if(minCapacity > oldCapacity){Object oldData[] elementData;int…

jenkins java_具有WildFly,Arquillian,Jenkins和OpenShift的Java EE 7部署管道

jenkins java技术提示&#xff03;54展示了如何Arquillianate&#xff08;Arquillianize&#xff1f;&#xff09;一个现有的Java EE项目并在WildFly在已知主机和端口上运行的远程模式下运行这些测试。 技术提示&#xff03;55展示了当WildFly在OpenShift中运行时如何运行这些测…

matplotlib 折线图_漂亮图表也可信手拈来,一文学会用Python绘制堆积折线图

今天咱们还是接着上次的话题&#xff0c;继续和大家聊聊关于Python绘图相关的东东哦&#xff0c;上次已经和大家讨论完了如何给自己所绘制的图表中添加装饰线以及修改装饰线密度的方法&#xff0c;今天呢&#xff0c;咱们再聊点的新的东东哦&#xff0c;还是和大家继续深耕Pyth…

C语言 | 赋值与运算符

本章以鸡兔同笼为例&#xff0c;讲解赋值语句和一些简单的运算符。相关知识点&#xff1a;scanf(" %d " , &i ); 输入函数&#xff0c;表示输入一个整数&#xff08;%d&#xff09;&#xff0c;赋值给 i&#xff08;&i&#xff09;C语言中加法运算符为 减法…

菜鸟学java要多久_菜鸟学java,根本停不下来!

位运算符&: 两个2进制的操作数,同一位数的两个数如果有一个为0结果就为0,两个都为1才是1.| : 两个2进制的操作数,同一位数的两个数如果有一个为1,两个都为0才是0.^ : 两个2进制的操作数,同一位数的两个数如果相同为0,不同为1.位移运算符<< 左移:把第一个二进制的操作…