java - JPQL 查询未返回预期结果

标签 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());;
    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/

相关文章:

java - UUID 的哈希码等于 Integer.MIN_VALUE

java - 测试应用程序时出错 - Firebase 测试实验室

java - 如何从 java.nio.Path 获取路径字符串?

java - 使用 Spring 4 未从 web.xml 中选取 include-prelude

Spring,JMS - 无法为 XML 架构命名空间找到 Spring NamespaceHandler

java - 在 Android 上运行 shell 命令不会返回任何结果

mysql - 如何将 varchar 转换为 datetime,不起作用

sql - Azure SQL 数据库行号无法正常工作

mysql - 卡住;带有聚合函数的 SQL case 语句

java - 以静默方式将作业返回到队列