Spring数据@Query:如果给出了可选的布尔参数,则检查where子句中其他String列的大小

时间:2017-02-21 11:49:34

标签: spring hibernate spring-data hql spring-data-jpa

我试图在我的一个存储库中构建一个@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 ...

1 个答案:

答案 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))
)