如何在 HQL 查询中检查 NULL 或无效

Posted

技术标签:

【中文标题】如何在 HQL 查询中检查 NULL 或无效【英文标题】:How to check NULL or not valid in HQL query 【发布时间】:2014-12-15 12:57:30 【问题描述】:

我有两个不同的表工件和分类。我想检索没有分类的工件列表。分类表包含 ID(PK)、Artifact_Id(外键)、Active(0/1),而工件表包含 ID(PK)、Name。每个工件可以有许多分类。我想在没有分类时返回工件列表(即分类不包含该工件或工件具有分类但所有实例均未激活(0))

例如

Artifact
Id Name
1  xyz
2  pqr
3  abc

Classification
Id Artifact_id active
a1 1            0 
a2 1            0
a3 1            0
a4 3            0
a5 3            1

在上述情况下,工件 1 和 2 没有分类,但 3 有分类,因为一个实例处于活动状态 (1)。所以我想返回 1 和 2。我不知道如何查询这个。 这是我尝试过的(虽然不是太多而且是错误的)

def list = findAll("from artifact as a full outer join classification as c on a.id=c.artifact_id where active == 0 OR c.aritfact_id is NULL,[max:limit, offset:startPos])

我也在sql中尝试了一些东西

select *  from ARTIFACT full outer join classification  on artifact.id = classification.ARTIFACT_ID where sum(classification.active) == 0 OR classification.aritfact_id is NULL

【问题讨论】:

【参考方案1】:

在 SQL 中你可以这样做

SELECT * FROM Artifact WHERE Id NOT IN ( SELECT Artifact_id FROM Classification WHERE active = 1);

基本上,您会获得所有具有活动分类的工件 ID 的列表,然后仅获得该列表中的工件,即非活动分类或根本没有分类。

【讨论】:

非常感谢这对我帮助很大:) NOT IN 受 HQL 支持,因此简单地引用对象应该可以工作,就像:从 Artifact art where art.Id not in (select c.Artifact_id from Classification c where c.active = 1)

以上是关于如何在 HQL 查询中检查 NULL 或无效的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate:如何使用HQL设置NULL查询参数值?

如何在现有的 Hql 或 SQL 查询中应用“With UR”子句?如何在我的查询为字符串格式的 Java 文件中附加它

如何在nHibernate中运行更新HQL查询?

如何编写 hql 查询或条件查询以根据时间戳获取最新记录

如何使用 LINQ 或 HQL 执行以下 SQL 查询

如何在java中用hql或sql查询得到某表的所有字段名?