Java JPQL查询未返回预期结果

Java JPQL查询未返回预期结果,java,sql,spring,spring-mvc,jpa,Java,Sql,Spring,Spring Mvc,Jpa,以下JPQL查询未返回结果。如何修改它,使其返回预期的结果 @SuppressWarnings("unchecked") public Collection<Description> findDescriptionsForConcept(Concept conc) { System.out.println("in JpaSnomedRepository(), conc.getConceptPk().getId() is: "+conc.getConceptPk().getId

以下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();
}
@SuppressWarnings(“未选中”)
公共集合findDescriptionsForConcept(概念集中){
println(“在JpaSnomedRepository()中,conc.getConceptPk().getId()是:”+conc.getConceptPk().getId());;
Query Query=this.em.createQuery(“从Description descr中选择descr,其中descr.concept=:cid”);
query.setParameter(“cid”,conc);
返回query.getResultList();
}

注意:解决方案是在description类中更改manytone关系中的一个join列的名称。但我将下面的一个答案标记为已接受,因为此人花费了大量时间试图帮助我

尝试稍微改变一下方法,将
id
设置为参数,而不是整个
概念

此代码假定您的
SnomedDescription
类具有类似于
私有概念的内容:

Query query = this.em.createQuery("SELECT descr FROM SnomedDescription descr WHERE descr.concept.conceptPk.id =:cid");
query.setParameter("cid", conc.getConceptPk().getId());

还有一件事对我来说很可疑-
概念
描述
都与一对多关系有关。考虑修改,您可能想使概念> /Cube >只有一个代码>描述< /> > .< /P> < P>由Hibernate生成的查询很好。让我们一步一步地分析一下

  • 我们有一个SnomedDescription实体,它有一个由两个组成的复杂键 列:id和effectiveTime
  • SnomedDescription实体与另一个名为SnomedConcept的实体具有
    @ManyTwoOne
    关系
  • SnomedConcept还有一个复杂的键。从您的问题中,我们不确定它由哪些列组成,但从
    @ManyTwoOne
    关系定义中,我们可以假设它也是id和effectiveTime。这实际上很奇怪,因为这意味着
    @OneToOne
    关系应该更合适,就像@Alex Malev建议的那样(或者映射定义不正确)。基本上,我们不能有两个相同id和有效时间的SnomedDescription,因此一次最多只能有一个SnomedDescription与一个SnomedConcept关联
  • 为什么生成的查询很好?因为

    DESCRIPTION.CONCEPT.pk.ID=DESCRIPTION.ID

    这就是关系的定义

  • 如果JPQL类似于
    “从SnomedDescription descr中选择descr,其中descr.concept=:concept”
    ,则生成的查询将有两个约束:id和effectiveTime,并且最多匹配一行

  • 如果您仍然想使用@manytone关系,我相信只要删除第二个@join列-of name=“effectiveTime”-就可以了


我想我们昨天讨论了这个问题,您设法引用了
概念
s字段
conceptPk
。尝试在这里使用相同的解决方案,因为变量名有问题,99%的问题与昨天的问题相同。前面的注释:您使用了字段conceptPk。这是一个字母的区别,但它很重要。让我们继续这里:@CodeMed您可以发布生成输出的JPA查询吗?可以尝试检查实际生成的查询。如果使用Hibernate,可以将Hibernate.show\u sql=true。这应该会给你一些提示。好的,现在最不需要的是你希望查询看起来是什么样子。只需自己编写MySql查询,在数据库上测试并发布即可。然后,我们就可以知道如何定义JPA映射以及如何构造正确的JPQL。不客气。那么,snomed概念的主键是什么呢?另外,在您的屏幕截图中,MySql查询只有一个约束,即conceptid,那么为什么您会惊讶于它返回的结果比通过两个约束(id和effectiveTime)查询的结果要多呢?