2017-02-21 31 views
1

Я пытаюсь создать @Query в одном из своих репозиториев, который в моем примере получает необязательный логический параметр с именем «hasComment». Если Boolean задан/существует, я хочу сделать проверку длины на отдельном столбце с переменным символом («комментарий») в разделе where.Данные весны @Query: Если необязательный логический параметр задан для проверки размера другого столбца String, где:

В настоящее время им присвоен следующий код, который я не ожидал работать (и, конечно же, нет), но он должен показать, как я представлял, как он может работать.

@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

Я не думаю, что можно использовать CASE внутри условия WHERE. Что касается вашего запроса есть обходной путь

"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)) 
)  
+0

работает отлично ... большое спасибо! – StephanM

Смежные вопросы