[英]Avoid fetching @ManyToOne property in Spring data JPA
我有以下三个实体。 我正在使用基于 Lombok 的 getter 和 setter:
@Getter
@Setter
@EqualsAndHashCode(callSuper = true, exclude = { "cClasses"})
class AClass {
// some properties
@OneToMany(mappedBy = "aClass", orphanRemoval = true)
private List<CClass> cClasses;
}
class BClass {
// some properties
}
@Getter
@Setter
@EqualsAndHashCode(callSuper = true, exclude = { "aClass", "bClass"})
class CClass {
// other properties
// this is bidirectional
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "A_ID", referencedColumnName = "A_ID")
private AClass aClass;
// this is unidirectional
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "B_ID", referencedColumnName = "B_ID")
private BClass bClass;
}
并通过 JPA 存储库类如下所示:
@Repository
public interface CClassRepository extends JpaRepository<CClass, Long> {
List<CClass> findByBClassBidIn(List<Long> ids);
}
输出按预期进行,但性能很差。 我可以在日志中看到所有 AClass 的选择查询也正在执行。 如何避免调用 @ManyToOne 属性 aClass。
我尝试在 CClass 的 aClass 属性上使用 @JsonManagedReference 和 @JsonIgnore。 但是当我调用存储库方法时它仍然在获取这些记录。 请建议如何解决这个问题。
最好把关系ClassC
,让ClassB
知道ClassC
class BClass {
@OneTOMany(...)
private CClass cClass;
}
@Repository
public interface BClassRepository extends JpaRepository<BClass, Long> {
@Query("select ClassB.cClass where ClassB.id is in `ids`") // might be wrong syntax
List<CClass> findCclassesByBClassIdIn(List<Long> ids);
}
它只查询一次数据库,即从所有者一侧查询数据库,即带有@JoinColumn 注释的一侧。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.