jpql变量,可以为null

时间:2017-05-17 18:45:39

标签: java hibernate jpa

我在JpaRepository中有一个jpql查询,如下所示:

@Query("select l from LogEntity l where l.codePackage = :codePackage and l.codeFile = :codeFile order by l.id desc")
public Page<LogEntity> findSimilarAngularLog (@Param("codePackage") String codePackage, @Param("codeFile") String codeFile, Pageable pageRequest);

变量codePackagecodeFile可以为NULL。但是hibernate总是像

那样
... where l.codePackage=? and l.codeFile=? ...

出来了。因此,如果其中一个或两个都为NULL,则l.codeFile=NULL而不是l.codeFile IS NULL。然后他根本找不到任何东西 如果我将hibernate生成的sql字符串复制到我的MySQL控制台并将=NULL更改为IS NULL,他将找到所有内容。

那么如何更改hibernate jpa的行为,以便在我的@Query String中正确处理NULL。

非常感谢和问候

2 个答案:

答案 0 :(得分:0)

WHERE ((:param is null and t.field is null) or t.field = :param)
@Query("select l from LogEntity l where ((:codePackage is null and l.codePackage is null) or l.codePackage = :codePackage ) and ((:codeFile is null and l.codeFile is null) or l.codeFile = :codeFile ) order by l.id desc")

答案 1 :(得分:0)

您可以使用以下查询:

@Query("select l from LogEntity l where ((:codePackage is null and l.codePackage is null) or l.codePackage = :codePackage) and ((:codeFile is null and l.codeFile is null) or l.codeFile = :codeFile) order by l.id desc")

但是,通过逻辑而不是像命名查询那样使用hql,这不是一个好主意吗?

更好的逻辑是使用if条件,比如

if(codePackage == null) {
    query += " l.codePackage is null ";
}
else {
    query += " l.codePackage = :codePackage ";
}
***code***
//query execution code