如何在 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 或无效的主要内容,如果未能解决你的问题,请参考以下文章
如何在现有的 Hql 或 SQL 查询中应用“With UR”子句?如何在我的查询为字符串格式的 Java 文件中附加它