我正在尝试选择具有Long值A
的实体b
和一堆其他值c
。我希望获得A
值最大的b
,或者如果不存在此值,则返回到A
b
为空的位置。
在我看来,根据this doc,MAX(x)
将为Long数据类型返回null,所以我希望这样做:
SELECT entity FROM A entity
WHERE entity.b = (SELECT MAX(a.b) FROM A a)
AND entity.c = :c
当b
具有已定义的Long值时,此方法很有效。但是当b
为null时,我得不到结果。似乎=
运算符无法比较NULL值。
我尝试在IS NULL
子句中使用OR
,但如果MAX结果为null,并且以下查询同时返回max long值和null值,我只希望实体具有null值:
SELECT entity FROM A entity
WHERE (
(entity.b = (SELECT MAX(a.b) FROM A a))
(OR entity.b IS NULL)
)
AND entity.c = :c
如何选择具有最大值b
的实体或未设置b
的实体,获取b
为空的实体?
答案 0 :(得分:0)
NULLS FIRST|LAST
可用于对结果进行排序,然后将结果限制为1.然后无需使用MAX(x)
。
由于NULL始终排在第一位且我的环境不支持NULLS LAST
我使用这样的查询解决了这个问题:
SELECT entity FROM A entity
WHERE entity.b = (SELECT MAX(a.b) FROM A a)
AND entity.c = :c
ORDER BY entity.b ASC
还有一些代码:
try {
...
List<A> as = q.getResultList();
result = as.get(as.size() - 1);
catch (NoResultException e) {
// doo something
}
仍然对使用JSQL比较的答案非常感兴趣!