2009-11-05 70 views
8

我想添加一個左連接上TASK表時出現以下情況: LEFT JOIN FETCH上 PROMPT P(t.id = p.task.id 和p.applicationName在( 'XXX')Hibernate的HQL:如何使用複雜的LEFT JOIN取

這裏是我的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 

我得到下面的異常,可能是由於 「對」 的文章:

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; 
    } 

如何使用LEFT JOIN 使用我的病情p.applicationName在( 'XXX')取

+0

您發佈的類結構(我假設所有這些屬性都有適當的註釋)不會將'Prompt'鏈接到任何其他類。你的SQL通過'task_id'連接'Prompt'和'Task',但是上面沒有匹配的屬性。 'Task'是'Prompt'屬性嗎?或相反亦然?你能澄清嗎? – ChssPly76 2009-11-08 17:46:34

回答

23

這裏有幾個問題:

  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 fetch連同with條件。如果需要關聯,則可以用inner join fetchwhere替換它。

如果在類路徑問題解決後仍然遇到問題,請隨時發佈映射,如果您需要實際HQL的幫助。

+0

@ ChssPly76:我很驚訝於你對Hibernate的內部知識有多瞭解,我推測你一定是從開始就一直在使用它,或者你實際上提交了代碼項目或者兩者兼而有之 - 無論哪種方式,它的偉大讓你在這裏照亮編碼羣衆。 – 2009-11-06 01:25:35

+1

現在,你會讓加文嫉妒。我當然在開玩笑:-) - 謝謝。 – ChssPly76 2009-11-06 01:48:10

+0

感謝您的回覆,但我仍然需要獲取提示。 如何使用我的條件p.applicationName('XXX')中的左連接**獲取**? – Keren 2009-11-08 08:47:07