如何使用Java Springboot JpaRepository根据需要动态加载映射关系数据?

问题描述 投票:0回答:2

我对 Java Springboot 框架非常陌生。我遵循了几个教程,发现每次向服务器发出 HTTP 请求时,JpaRepository 都会返回实体及其所有映射关系。

这是代码

@Table(name = "provinces")
public class Province {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false)
    private Long id;

    private String name;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "province_id")
    private List<City> cities;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "province_id")
    private List<PreRelease> preReleases;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "province_id")
    private List<Project> projects;
}
@Table(name = "cities")
public class City {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "province_id")
    private Province province;

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "city_id")
    private List<Project> projects;
}
public class Project {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false)
    private Integer id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "province_id")
    private Province province;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "city_id")
    private City city;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "pre_release_id")
    private PreRelease preRelease;
}

我的问题是:JpaRepository可以动态加载关系数据吗?有时我确实想要它的映射关系,有时我不想要它的映射关系数据。

任何帮助将不胜感激!

java spring-boot spring-data-jpa orm
2个回答
1
投票

首先。仅当您尝试访问相关实体时才会加载它们,因为您在关系中定义了

fetch = FetchType.LAZY

此外,这取决于你所说的关系是什么意思。如果你的意思是你只想加载相关实体的id而不是整个实体,我会建议这样的东西(自JAVA 17起重要记录可用):

@Query(SELECT new com.baeldung.jpa.records.ProjectRecord(p.id, p.province.id, p.city.id, p.preRelease.id) FROM Project p WHERE b.id = :id") 
ProjectRecord findProjectById(@Param("id") Long id);

在存储库中使用此注释,仅选择 ids 并将其写入单独的模型,因此它不会加载所有相关实体。如果这不起作用,可以尝试在 @Query 中使用 nativeQuery=true 并从 JPQL 查询切换到本机 SQL :)

https://www.baeldung.com/spring-jpa-java-records


1
投票

正如@Thomas Meyer 在他的回答中提到的,你已经定义了

fetch=FetchType.LAZY

这确保仅在需要时而不是始终获取这些数据。

您也可以使用

@JsonIgnore

关于从数据库获取数据时要忽略的属性。

例如:

@Table(name = "cities")
public class City {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "province_id")
    private Province province;

    @JsonIgnore                      //To ignore projects while fetching the data
    @OneToMany
    @JoinColumn(name = "city_id")
    private List<Project> projects;
}

或者,

正如 @Thomas Meyer 的答案中提到的,您可以使用 Jpql 在存储库中使用自定义方法创建方法。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.