Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate jpql";加入“获取”;vs实体图_Hibernate_Jpa - Fatal编程技术网

Hibernate jpql";加入“获取”;vs实体图

Hibernate jpql";加入“获取”;vs实体图,hibernate,jpa,Hibernate,Jpa,我想使用jpql或jpa实体图加载相关实体 看起来两者做的事情是一样的 为什么我应该使用实体图而不是普通的jpql?有什么好处吗 使用jpql的区别是什么: select distinct u from User u join fetch u.hobbies a join fetch a.tasks 或实体图: @NamedEntityGraph(name = "User.eagerfetch", attributeNodes = { @NamedAttributeNode(

我想使用jpql或jpa实体图加载相关实体

看起来两者做的事情是一样的

为什么我应该使用实体图而不是普通的jpql?有什么好处吗

使用jpql的区别是什么:

select distinct u from User u join fetch u.hobbies a join fetch a.tasks
或实体图:

@NamedEntityGraph(name = "User.eagerfetch", attributeNodes = { 
        @NamedAttributeNode("hobbies"),
        @NamedAttributeNode("tasks")})

不同之处在于代码的专业成熟度

NamedEntityGraphs的清晰性、可读性、可维护性和代码质量明显更好


EntityGraph是在编译时计算的,它与实体定义紧密耦合,因此不太容易出错。对Entity类的任何更改都会破坏图形定义,因此代码甚至不会像对查询字符串那样使用这些错误进行编译。手写查询是黑客的解决方案。更不用说所有的实体定义都在一个地方;在@Entity类中,并不是到处都是。

理论上,JPA中不允许像您这里这样的多级连接,因此正确的连接方式可能只存在于EntityGraphs中。请注意,EntityGraph似乎不正确,因为要进行两级连接(如查询),您需要有子图或类似的东西。我有一个相当重要的项目,像你们一样有连接,我把它转换成EntityGraphs。在生成的查询方面,我没有看到任何差异,但它确实删除了DevStudio给我的验证错误。大概我有一个“更正确”的应用程序,但这一点还不清楚。是的,
@NamedEntityGraph
需要任务的
@NamedSubgraph
。我认为@EntityGraph有一个限制,你不能执行findAll实体并获得每个实体的关系,而不做
where
类似的语句,无法执行的示例:
@EntityGraph
列出findAll();因此,它应该是
@EntityGraph List findAllBy()
@EntityGraph List findallbydnotnull()