JPQL在MAX(Long)和null之间的比较

时间:2016-10-13 11:16:34

标签: java jpa jpql

我正在尝试选择具有Long值A的实体b和一堆其他值c。我希望获得A值最大的b,或者如果不存在此值,则返回到A b为空的位置。

在我看来,根据this docMAX(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为空的实体?

1 个答案:

答案 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比较的答案非常感兴趣!