以下 JPQL 查询未返回结果。我如何改变它才能返回预期的结果?
@SuppressWarnings("unchecked")
public Collection<Description> findDescriptionsForConcept(Concept conc) {
System.out.println("in JpaSnomedRepository(), conc.getConceptPk().getId() is: "+conc.getConceptPk().getId());;
Query query = this.em.createQuery("SELECT descr FROM Description descr WHERE descr.concept =:cid");
query.setParameter("cid", conc);
return query.getResultList();
}
注意:解决方案是更改描述类中多对一关系中的联接列之一的名称。但我将下面的答案之一标记为已接受,因为该人投入了很多试图帮助我的时间。
最佳答案
hibernate生成的查询没问题。我们来逐步分析一下。
- 我们有一个 SnomedDescription 实体,它有一个由两个组成的复杂 key 列:id 和 effectiveTime。
- SnomedDescription 实体具有
@ManyTwoOne
与另一个名为 SnomedConcept 的实体的关系。 - SnomedConcept 也有一个复杂的 key 。从你的问题来看,我们不确定它是由什么列组成的,但是从
@ManyTwoOne
关系定义我们可以假设它也是id和 effectiveTime。这实际上很奇怪,因为这意味着@OneToOne
关系应该更合适,就像 @Alex Malev 建议的那样(或者映射定义不正确)。基本上我们不能有两个具有相同 id 和 effectiveTime 的 SnomedDescription,因此一次最多会有一个 SnomedDescription 与一个 SnomedConcept 关联。 为什么生成的查询没问题?因为
DESCRIPTION.CONCEPT.CONCEPTPK.ID =DESCRIPTION.ID
这就是关系的定义方式!
如果 JPQL 类似于
"SELECT descr FROM SnomedDescription descr WHERE descr.concept = :concept"
,生成的查询将有两个约束:id 和 effectiveTime,并且最多匹配一行。如果您仍然想利用 @ManyToOne 关系,我相信只需删除第二个 @JoinColumn - name = "effectiveTime"- 就可以了。
关于java - JPQL 查询未返回预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23501796/