在使用Spring JPA进行实体关系检索时,我们有时需要对结果进行限制,以满足特定的业务需求。在本文中,我们将介绍如何使用Spring JPA来检索有限制的实体关系。通过使用Spring JPA提供的查询注解和方法,我们可以轻松地实现对实体关系的限制,从而提高查询的效率和准确性。无论您是初学者还是有经验的开发人员,本文都将为您提供清晰的指导和实用的示例,帮助您更好地理解和应用Spring JPA的实体关系检索功能。
问题内容
这是一个关于关系和数据库往返的优化问题。
tl;dr:您有两个实体 a 和 b,它们具有多对多关系。您需要检索 a 的实例及其相关 b 实体的特定子集。 这是重要的部分,您不想检索与该 a 实例相关的所有 b 实体,而只想检索其中的子集。
长话
考虑以下实体;
public class a { @id private long id; @manytomany private list<b> blist; }
public class B { @Id private Long id; @ManyToMany private List<A> aList; private Boolean somePropertyToUseWhileFiltering; }
我正在尝试检索 a 实体的实例及其相关 b 实例的子集。在我看来,这可以通过三种方式实现;
-
在检索 a 的同时获取所有相关的 b 实体,并丢弃不需要的实体。
-
使用惰性关系进行两个不同的存储库调用:首先获取没有相关 b 实例的 a 实例,然后获取指定所需过滤器和限制的 b 实例。
-
编写一个庞大的自定义 jpql 或 sql 查询,以获取 a 实例和相关 b 实例的特定子集。
我根本不喜欢第一种方法,因为它会检索很多不必要的行。第三种方法可能是复杂结构的最佳方法,但是为什么我首先要使用 orm 结构呢?
理论上所有这些都应该有效,我目前正在使用第二种方法,但我有一个担忧。对不同存储库进行多个存储库调用对于单个请求来说是否有害?因为我有一个复杂的实体结构,有很多关系。我猜这会增加数据库的往返次数。
还有其他更合适的方法来解决这个问题吗?
解决方法
我认为你可以使用嵌套投影: 投影
public interface awithfilteredblistprojection { long getid(); list<bprojection> getfilteredblist(); interface bprojection { string getsomepropertytousewhilefiltering(); // add other properties from b that you want to include } }
存储库
public interface ARepository extends JpaRepository<A, Long> { @Query("SELECT a FROM A a JOIN FETCH a.bList b WHERE a.id = :aId") Optional<AWithFilteredBListProjection> findAWithFilteredBList(@Param("aId") Long aId); }
以上是如何使用 Spring JPA 检索有限制的实体关系?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

禅工作室 13.0.1
功能强大的PHP集成开发环境