Hibernate HQL:如何使用复杂的左连接提取

时间:2009-11-05 11:22:31

标签: hibernate hql

我想在发生以下情况时在TASK表上添加左连接:  LEFT JOIN FETCH                 PROMPT p on(t.id = p.task.id 和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使用左连接获取

1 个答案:

答案 0 :(得分:27)

这里有几个问题:

  1. 您发布的HQL实际上并不是HQL :-)这是SQL的直接问题。对于HQL,您需要使用映射关联来连接表。请参阅下面的改进版本。
  2. 据我所知ON子句不支持括号中的多个连接条件。
  3. NoSuchMethodError不是Hibernate会抛出的东西:-)你可能在你的类路径中的某个地方有一个较旧版本的antlr.jar,它被取代而不是Hibernate所期望的版本。找到并删除它。
  4. 如果没有看到您的映射,以下内容可能不准确,但我会尝试编写更合适的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
    

    请注意,由于您无法将promptjoin fetch条件一起使用,因此未提取with。如果需要关联,您可以将其替换为inner join fetchwhere

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