繁体   English   中英

Spring Data JPA 条件实体加入

[英]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

逻辑上多borrowbook的关系。 直接用例是:在给定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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM