我在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);
变量codePackage
和codeFile
可以为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。
非常感谢和问候
答案 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