[英]JPQL query not returning expected results
以下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();
}
注意:解决方案是更改描述类中多对多关系中连接列之一的名称。 但是,我将以下答案之一标记为“已接受”,因为该人投入了大量时间来帮助我。
休眠生成的查询很好。 让我们逐步分析这一点。
@ManyTwoOne
关系。 @ManyTwoOne
关系定义我们可以认为它也是ID和effectiveTime。 实际上这很奇怪,因为这意味着@OneToOne
关系应该更适合,例如@Alex Malev建议(或映射定义不正确)。 基本上,我们不能有两个具有相同id和有效时间的SnomedDescription,因此一次最多只能有一个SnomedConcept关联一个SnomedDescription。 为什么生成的查询很好? 因为
DESCRIPTION.CONCEPT.CONCEPTPK.ID = DESCRIPTION.ID
这就是定义关系的方式!
如果JPQL类似于"SELECT descr FROM SnomedDescription descr WHERE descr.concept = :concept"
,则生成的查询将具有两个约束: id和有效时间,并且最多匹配一行。
如果您仍然想利用@ManyToOne关系,我相信只需删除第二个@JoinColumn-名称=“ effectiveTime”-就能解决问题。
尝试稍微改变方法,将id
设置为参数,而不是整个Concept
。
此代码假定您的SnomedDescription
类具有类似于private Concept concept
:
Query query = this.em.createQuery("SELECT descr FROM SnomedDescription descr WHERE descr.concept.conceptPk.id =:cid");
query.setParameter("cid", conc.getConceptPk().getId());
对我来说,还有另外一件事情看起来很可疑- Concept
和Description
存在一对多关系。 考虑修改一下,您可能希望使Concept
仅具有一个Description
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.