两个域类(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。
谢谢
最佳答案
基本上,您在where子句中具有带过滤器的右外部连接。同样,由于此过滤器用于左侧表(A),因此联接减少为内部联接。
我遇到过同样的问题,在HQL中解决此问题的唯一方法是检查是否为空
例如:
如下替换您的位置
where (a.id is null OR dateCreated < someDate)
我不理解选课的问题。这有效
关于hibernate - HQL:如果有时为空,如何筛选属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12058095/