views:

1996

answers:

1

Hi all,

I want to add a left join on TASK table when the following condition occurs: LEFT JOIN FETCH PROMPT p on (t.id = p.task.id and p.applicationName in ('XXX'))

Here is my hql query:

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

I get the following exception, probably due to "on" keyword:

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)

Any ideas?

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

How can i use left join fetch using my condition p.applicationName in ('XXX')?

+2  A: 

There are several problems here:

  1. Your HQL as you've posted it is not really HQL :-) It's straight up SQL. For HQL you need use mapped associations to join tables. See below for an improved version.
  2. As far as I'm aware ON clause does not support multiple joined conditions in parenthesis.
  3. NoSuchMethodError is not something Hibernate would throw :-) You likely have an older version of antlr.jar somewhere in your classpath and it gets picked up in place of the one expected by Hibernate. Find it and remove it.

Without seeing your mappings the following is likely inaccurate, but I'll take a stab at writing the more appropriate 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

Note that prompt is not fetched because you can't use join fetch together with with condition. You can replace it with inner join fetch and where if the association is required.

If you're still having trouble after the classpath issue is resolved, feel free to post your mappings if you need help with actual HQL.

ChssPly76
@ChssPly76: I'm amazed at how well you know the innards of Hibernate, I surmise you must have either been working with it from inception or you actually commit code the project or both -- either way its great having you here to illuminate the coder masses.
non sequitor
Now now, you'll make Gavin jealous. I'm joking of course :-) - thanks.
ChssPly76
Thanks for your reply but i still need to fetch prompt. How can i use left join **fetch** using my condition p.applicationName in ('XXX')?
Keren
@ChssPly76 Gavin has way too much ego to be jealous from anybody, even you :)
Pascal Thivent