首页 > Java > 正文

如何使用 Spring JPA 检索有限制的实体关系?

王林
发布: 2024-02-08 22:20:10
转载
1181 人浏览过

在使用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 实例的子集。在我看来,这可以通过三种方式实现;

  1. 在检索 a 的同时获取所有相关的 b 实体,并丢弃不需要的实体。

  2. 使用惰性关系进行两个不同的存储库调用:首先获取没有相关 b 实例的 a 实例,然后获取指定所需过滤器和限制的 b 实例。

  3. 编写一个庞大的自定义 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中文网其他相关文章!

来源:stackoverflow.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板