【问题标题】:JPQL query not returning expected resultsJPQL 查询未返回预期结果
【发布时间】:2014-06-23 11:39:27
【问题描述】:

以下 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,可以设置 hibernate.show_sql=true。这应该会给你一些提示。
  • 好的,现在缺少的最后一件事是您希望查询的样子。只需自己编写 MySql 查询,在您的数据库上测试并发布它。然后我们可以弄清楚如何定义 JPA 映射以及如何构造正确的 JPQL。

标签: java sql spring spring-mvc jpa


【解决方案1】:

hibernate 生成的查询没问题。让我们一步一步分析。

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

    DESCRIPTION.CONCEPT.CONCEPTPK.ID =DESCRIPTION.ID

    这就是定义关系的方式!

  • 如果 JPQL 类似于 "SELECT descr FROM SnomedDescription descr WHERE descr.concept = :concept",则生成的查询将有两个约束:ideffectiveTime,并且最多匹配一行。

  • 如果您仍想使用 @ManyToOne 关系,我相信只需删除第二个 @JoinColumn - of name = "effectiveTime" - 就可以解决问题。

【讨论】:

  • 不客气。那么什么是 SnomedConcept 主键呢?同样在您的屏幕截图中,MySql 查询只有一个约束,即概念 ID,那么为什么您会惊讶它返回的结果比通过两个约束(id 和有效时间)查询更多?
【解决方案2】:

尝试稍微改变方法,将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());

还有一件事对我来说看起来很可疑 - ConceptDescription 绑定了一对多关系。考虑修改一下,你可能想让Concept 只有一个Description

【讨论】:

  • 我想我们昨天讨论了这个问题,你设法引用了Concepts 字段conceptPk。尝试在这里使用相同的解决方案,因为变量名有问题,而且 99% 的问题与昨天相同。
  • 对该帖子的第一条评论:您使用了字段名称conceptPK。上一条评论:您使用了字段 conceptPk。这是一个字母的区别,但很重要。
  • 让我们在这里继续:chat.stackoverflow.com/rooms/52062/…
  • @CodeMed 你还能发布生成输出的 JPA 查询吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 2016-04-12
相关资源
最近更新 更多