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

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

王林
王林转载
2024-02-08 22:20:101194浏览

在使用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删除