在我们的EE6 / JPA项目中,我们正在使用具有映射关系的实体类。当在“相邻”表中建模字段时,一切都很好,即直接PK / FK关系,甚至是复合键。我们还使用在实体中整齐映射的连接表来实现一些多对多关系。
但我无法理解以下情况:
我们假设我有不同类别的书籍,以及可以附在书本上的作者。现在想象一下,我想在某些类别中“提升”某些作者。
现在,鉴于一本书,我可以强调某些作者。
在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;
}
但那可能不对,可以吗?
答案 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