0

两个域类(bean)

A 和 B,A 具有 B 类型的属性 b (-> Ab) 另外,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 有时为空,因此 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。

谢谢

4

2 回答 2

2

您基本上在 where 子句中有一个带有过滤器的右外连接。此外,由于此过滤器用于左侧表 (A),因此连接减少为内部连接。

我遇到了同样的问题,在 HQL 中解决它的唯一方法是检查 null ex:替换你的 where 如下

where (a.id is null OR dateCreated < someDate)

我不明白选课问题。这有效

于 2012-09-13T18:23:20.570 回答
1

您不能BA(where ais null) 中选择孤立的 s - 这毫无意义。您需要一个不同的查询来从中B进行选择。

所以最简单也可能是最好的工作方法是发出两个不同的查询。如果不可接受,请尝试HQL UNION 替换,或者退回到 SQL。

于 2012-08-21T18:27:45.650 回答