Как игнорировать SQL Query часть WHERE условно в JPA Query - PullRequest
0 голосов
/ 26 февраля 2019

Мне интересно, можно ли условно игнорировать часть запроса (а не всю, где часть).У меня есть запрос в JPA

    @Query("SELECT DISTINCT new it.akademija.wizards.models.document.DocumentGetReviewCommand(" +
        "d.author.firstname, d.author.lastname, d.id, d.title, d.description, d.documentType.title, d.submissionDate)" +
        " FROM Document d" +
        " JOIN d.documentType dt" +
        " JOIN dt.reviewUserGroups rug" +
        " JOIN rug.users u WHERE u.username = :username" +
        " AND d.documentState = it.akademija.wizards.enums.DocumentState.SUBMITTED" +
        " AND u <> d.author" +
        " **AND (lower(CONCAT(d.author.firstname, ' ', d.author.lastname)) like %:searchFor% " +
        " OR lower(d.title) like %:searchFor%" +
        " OR lower(d.description) like %:searchFor%" +
        " OR lower(d.id) like %:searchFor%" +
        " OR lower(dt.title) like %:searchFor%)")
   Page<DocumentGetReviewCommand> getDocumentsForReview(@Param(value = "username") String username,
                                                     @Param(value = "searchFor") String searchFor,
                                                     Pageable pageable);

Как я могу игнорировать нижнюю часть, если параметр searchFor пуст или пуст ("")

AND (lower(CONCAT(d.author.firstname, ' ', d.author.lastname)) like %:searchFor% " +
        " OR lower(d.title) like %:searchFor%" +
        " OR lower(d.description) like %:searchFor%" +
        " OR lower(d.id) like %:searchFor%" +
        " OR lower(dt.title) like %:searchFor%)

1 Ответ

0 голосов
/ 26 февраля 2019

Вы можете просто попытаться добавить логику, которая позволяет пропустить эти условия, если поиск будет нулевым или пустым:

AND
    (COALESCE(:searchFor, '') = '' OR
    (LOWER(CONCAT(d.author.firstname, ' ', d.author.lastname)) LIKE %:searchFor% OR
     LOWER(d.title) LIKE %:searchFor%" OR
     LOWER(d.description) LIKE %:searchFor% OR
     LOWER(d.id) LIKE %:searchFor% OR
     LOWER(dt.title) like %:searchFor%))
...