【问题标题】:Hibernate HQL: how to use a complex left join fetchHibernate HQL:如何使用复杂的左连接获取
【发布时间】:2010-12-13 09:18:59
【问题描述】:

当出现以下情况时,我想在 TASK 表上添加左连接: 左连接提取 PROMPT p on (t.id = p.task.id and p.applicationName in ('XXX'))

这是我的 hql 查询:

select
            distinct t        
        from
            TASK t
        LEFT JOIN FETCH
            SERVER ser 
                on t.id=ser.task_id 
        LEFT JOIN FETCH
            APPLICATION app 
                on ser.id=app.server_id         
        LEFT JOIN FETCH
            PROMPT p on (t.id  = p.task.id and p.applicationName in ('XXX'))
        where
            t.id=ser.task.id 
            and ser.id=app.server 
            and  app.name in ('XXX') 
        order by t.id 

我得到以下异常,可能是由于“on”关键字:

java.lang.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.recover(Lantlr/RecognitionException;Lantlr/collections/impl/BitSet;)V

      at org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:771)

有什么想法吗?

class Task {
    private String taskId;
    private Set<ServerDetails> servers;
}

class ServerDetails {
    private String id;
    private Set<ApplicationDetails> applications;
}

class ApplicationDetails {
   private String id;
}

    Class Prompt {
      private String applicationName;
    }

我如何在 ('XXX') 中使用我的条件 p.applicationName 来使用左连接 fetch

【问题讨论】:

  • 您发布的类结构(我假设所有这些属性都有适当的注释)没有将Prompt 链接到任何其他类。您的 SQL 通过 task_id 连接 PromptTask,但上面没有匹配的属性。 TaskPrompt 上的属性吗?或相反亦然?你能澄清一下吗?

标签: hibernate hql


【解决方案1】:

这里有几个问题:

  1. 您发布的 HQL 并不是真正的 HQL :-) 它是直接的 SQL。对于 HQL,您需要使用映射关联来连接表。请参阅下面的改进版本。
  2. 据我所知,ON 子句不支持括号中的多个连接条件。
  3. NoSuchMethodError 不是 Hibernate 会抛出的东西 :-) 你可能在你的类路径中的某个地方有一个旧版本的 antlr.jar,它被拾取来代替 Hibernate 所期望的那个。找到并删除它。

如果没有看到您的映射,以下内容可能不准确,但我会尝试编写更合适的 HQL:

select distinct t        
  from TASK t
  left join fetch t.server ser
  left join fetch ser.application app
  left join t.prompt p with p.applicationName in ('XXX')
 order by t.id

请注意,prompt 未获取,因为您不能将join fetchwith 条件一起使用。如果需要关联,您可以将其替换为inner join fetchwhere

如果您在解决类路径问题后仍然遇到问题,如果您需要有关实际 HQL 的帮助,请随时发布您的映射。

【讨论】:

  • @ChssPly76:我很惊讶你对 Hibernate 的了解程度如此之深,我猜你一定是从一开始就在使用它,或者你实际上提交了项目代码,或者两者兼而有之——无论哪种方式很高兴有你在这里照亮编码器群众。
  • 现在,你会让加文嫉妒的。我当然是在开玩笑 :-) - 谢谢。
  • 感谢您的回复,但我仍然需要获取提示。如何使用我的条件 p.applicationName in ('XXX') 使用左连接 fetch
  • @ChssPly76 Gavin 太自负了,不会嫉妒任何人,甚至是你 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多