我试图在我的一个存储库中构建一个@Query,它获得一个名为" hasComment"的可选布尔参数。在我的例子中。如果给出/存在布尔值,我想在我的where子句中对另一个字符变化列(" comment")进行长度检查。
目前我有以下代码,我没有期望工作(当然不是),但它应该表明我想象它是如何工作的方式。
@Query("SELECT t "
+ "FROM Test t "
+ "WHERE "
+ "(:from IS NULL OR t.startTs >= :from) "
+ "AND (:to IS NULL OR t.endTs <= :to) "
+ "AND ((:hasComment) IS NULL OR ("
+ "(CASE WHEN :hasComment = true THEN length(t.comment) > 0)"
+ "OR (CASE WHEN :hasComment = false THEN length(t.comment) = 0 OR t.comment IS NULL)"
+ ")"
Page<Test> find(@Param("from") Instant from, @Param("to") Instant to,
@Param("hasComment") Boolean hasComment, Pageable pageable);
有人可以帮帮我吗?我真的无法找到有关如何构建此查询的信息,即使有可能使用@Query ...
答案 0 :(得分:2)
我不认为可以在WHERE条件中使用CASE。 关于您的查询,有一个解决方法
"AND (:to IS NULL OR t.endTs <= :to) "
+ "AND ((:hasCategory) IS NULL OR ("
+ "(CASE WHEN :hasCategory = true THEN length(t.comment) > 0)"
+ "OR (CASE WHEN :hasCategory = false THEN length(t.comment) = 0 OR t.comment IS NULL)"
+ ")"
到
AND ((:hasCategory) IS NULL OR (
(:hasCategory=true AND length(t.comment)>0) OR
(:hasCategory = false AND length(t.comment) = 0) OR
(:hasCategory = false AND t.comment IS NULL))
)