hibernate - HQL:如果有时为空,如何筛选属性

标签 hibernate grails join hql isnull

两个域类(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/

相关文章:

php - 从表中选择逗号分隔的记录以及用户图像

Hibernate:如何为非实体 Sql 查询的列设置别名?

spring - ConstraintValidator 依赖注入(inject)在类级别验证时会导致 ValidationException

grails - grails 2.0-正确使用serverURL进行生产?

grails - 如何在 grails gant 脚本中调用非默认目标

sql - 查询在 PostgreSQL 中有效,但在 HSQL 中失败。我该如何解决?

java - hibernate/ Spring : Is There Row-Level Security?

hibernate - GORM 不工作。由 : org. hibernate.HibernateException 引起的错误:没有为当前线程找到 session

grails - 什么是Jetty Grails?

mysql - 验证连接表中两个 id 的唯一性