如何在JPA中为多个表建模传递连接

时间:2017-06-28 07:08:25

标签: jpa

在我们的EE6 / JPA项目中,我们正在使用具有映射关系的实体类。当在“相邻”表中建模字段时,一切都很好,即直接PK / FK关系,甚至是复合键。我们还使用在实体中整齐映射的连接表来实现一些多对多关系。

但我无法理解以下情况:

simple DB model requiring multiple joins

我们假设我有不同类别的书籍,以及可以附在书本上的作者。现在想象一下,我想在某些类别中“提升”某些作者。

现在,鉴于一本书,我可以强调某些作者。

在SQL(或者,我猜是JPQL)查询中,使用JOIN来获取作者列表及其提升因子将是非常简单的。 (或者甚至只针对给定书籍上的给定作者,显示该因素。)

但在JPA?我不知道。

我在BookAuthor.java ...

中尝试过类似的内容
@OneToOne(fetch = FetchType.LAZY)
@JoinColumns({
              @JoinColumn(name = "AID", referencedColumnName = "AID", nullable = false, insertable = false, updatable = false),
              @JoinColumn(name = "CID", referencedColumnName = "CID", nullable = false, insertable = false, updatable = false) })
private Boost boost;

...但显然JPA不知道在哪里可以找到“CID”。

我目前的解决方法是采用一种短暂的方法,首先获取每本书的所有提升因子,然后只返回适合当前作者的方法。

@Transient
public Boost getBoost() {
    Set<Boost> boosts = this.getBook().getCategory().getBoosts();
    for (Boost elem : boosts) {
        if (elem.getAuthor().equals(this.author))
        return elem;
    }
    return null;
}

但那可能不对,可以吗?

1 个答案:

答案 0 :(得分:0)

是否需要在book_author对象上添加一个boost对象?你可以找一个发现者&#34; findByBookAuthor&#34;在使用jpql的提升检索服务上:

Select b FROM Boost b join Category c join Book bk where bk.BID = :BID AND c.CID = bk.CID AND b.AID = :AID