[英]Spring Data JPA conditional entity join
我想在 JPA 中映射不寻常的表设置。 这是一个简化的示例:
book
company_id int
book_id int
series_id int
borrow
company_id int
book_id int
type char
问题是borrow.book_id
超载了:
borrow.type
是'B',那么borrow.book_id == book.book_id
borrow.type
是'S',则borrow.book_id == book.series_id
逻辑上多borrow
一book
的关系。 直接用例是:在给定book
列表的情况下获取所有borrow
行。 这应该如何在 Spring Data JPA 中映射?
您可以在 Book 的 Borrow 实体映射中尝试以下操作 -
@ManyToOne
@JoinColumnsOrFormulas(
{ @JoinColumnOrFormula(
formula = @JoinFormula(
value = "case " +
"when type == 'B' then book_id" +
"when type == 'S' then series_id " +
"else 1" +
"end",
referencedColumnName="book_id")) }
)
但是您需要使用@ManyToOne 注释,即使这似乎是一个@OneToOne 关联。 联接公式不适用于 OneToOne。 这种方法的缺点是,hibernate 将不必要地创建 2 个连接,这些连接可以使用本机查询仅使用 1 个来完成
如果您使用的是弹簧数据 JPA,那么在您的存储库中,您可以使用以下方法 -
@Query(value="sql stmt with conditional join and IN clause", nativeQuery = true)
List<Idto> findAllBorrowByBook(List<int> bookIds);
其中“Idto”是映射结果集的接口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.