Spring JPA中关系的动态获取

Posted

技术标签:

【中文标题】Spring JPA中关系的动态获取【英文标题】:Dynamic fetching for relations in Spring JPA 【发布时间】:2019-11-16 01:45:01 【问题描述】:

我希望能够根据调用的 RestService 动态加载我的实体的关系。

实体类:

@Entity
public class Order 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @ManyToOne
    private Buyer buyer;
    // some more attributes


@Entity
public class Buyer 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    // some more attributes

RestController 类:

@GetMapping
public Iterable<Order> getAll() 
    // here I want JPA to NOT load the buyers for the order
    return orderRepository.findAll();


@GetMapping("/id")
public Order get(@PathVariable("id") String id) 
    // here I want JPA to load the buyers for the order
    return orderRepository.findById(Long.parseLong(id)).orElseThrow();

就我的理解和尝试而言,LAZYEAGER 或 json 注释(如 @JsonIgnore@JsonIdentityInfo@JsonManagedReference@JsonBackReference)似乎都无法实现这一点。

如果这是不可能的,也许有人可以解释如何解决这个问题。一方面,我有时需要前端中的这些关系来显示一些值,另一方面,当我总是加载它们时,我会遇到巨大的性能问题或无限递归。

【问题讨论】:

您可能正在寻找@EntityGraph 谢谢!!这正是我正在寻找的:) 【参考方案1】:

我不认为 JPA 直接支持您的用例。

一种选择是两次创建相同的实体 - 一次使用渴望,另一次使用惰性。在方法中切换它们。

另一种选择是使用 DTO(数据传输对象)作为响应,而不是实体类本身。不过,您必须编写映射器逻辑才能将实体转换为 DTO。

【讨论】:

@EntityGraph 确实有办法做到这一点。

以上是关于Spring JPA中关系的动态获取的主要内容,如果未能解决你的问题,请参考以下文章

基于Spring Boot,使用JPA动态调用Sql查询数据

Spring Data JPA:创建规范查询获取连接

Spring-Data-JPA 中的查询如何动态组装条件?

spring Data jpa 一对多关联 动态查询怎么写

spring data jpa 动态查询(mysql)

spring data jpa 动态查询(mysql)