在使用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中文网其他相关文章!