我想在发生以下情况时在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使用左连接获取?
答案 0 :(得分:27)
这里有几个问题:
ON
子句不支持括号中的多个连接条件。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 fetch
和where
。
如果在解决类路径问题后仍然遇到问题,请在需要实际HQL帮助时随意发布映射。