【发布时间】:2012-08-21 15:18:13
【问题描述】:
两个域类(bean)
A 和 B,A 具有 B 类型的属性 b (-> A.b) 此外,A 是使用单个表的继承层次结构的父级。
我想使用 HQL 加入这些,并在结果集中保留所有与 A 无关的 B。 如果 A 和 B 之间存在关联,我只想要基于 A 的某些标准的其中一些。
我最初的查询是这样的
SELECT (a.something, b.something)
FROM A as a RIGHT OUTER JOIN a.b
WHERE a.dateCreated < someDate;
此查询的问题:a 有时为 null,因此 WHERE 条件解析为 false,并且不返回元组,因此结果集不包含与 A 无关的 B。
所以我将查询修改为如下内容:
SELECT (a.something, b.something)
FROM A as a RIGHT OUTER JOIN a.b
WHERE a is null or (a.dateCreated < someDate);
这在生成的 SQL 中没有帮助,似乎无法控制类选择语句的位置,例如
where a.class in ('someChildOfA', 'anotherChildOfA', 'aThirdChildOfA')
被插入;它必须放在括号内,即
where a is null or (a.dateCreated < someDate and a.class in ('someChildOfA', 'anotherChildOfA', aThirdChildOfA'))
但它最终被添加到外部,即
where (a.id is null OR dateCreated < someDate) and a.class in ('someChildOfA', 'anotherChildOfA', 'aThirdChildOfA')
现在,我有点想不通...有任何(甚至更简洁的)建议吗?如果重要的话,我正在使用 Grails。
谢谢
【问题讨论】:
-
stackoverflow.com/questions/2093025/… 显示了一些关于如何禁用多态查询行为的选项(希望这将消除
a.class in ('someChildOfA', 'anotherChildOfA', 'aThirdChildOfA')语句)关于如何在每个查询的基础上执行此操作还有一个粗略的想法,我需要。有人在 Grails 中做过类似的事情吗?
标签: hibernate grails join hql isnull