Собственный запрос Hibernate с нулевым параметром Spring Boot - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь передать нулевой параметр (: searchQuery) в собственный запрос в Spring Boot, я пробовал различные способы, но всякий раз, когда я передаю ноль, я получаю ошибку

ОШИБКА: операторне существует: текст ~~ bytea

Запрос

@Query(value = "SELECT count(*) FROM analysis_history ah, analysis_group ag WHERE ah.analysis_group_id = ag.id "
+ "AND ah.creation_date BETWEEN :from AND :to AND ((:searchQuery IS NULL) OR (:searchQuery IS NOT NULL AND ag.name LIKE :searchQuery))", nativeQuery = true)
Long count(@Param("from") Date from, @Param("to") Date to, @Param("searchQuery") String searchQuery);

Может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Есть способ обойти это, но вам нужен доступ к EntityManager, и вы не должны использовать аннотацию @Query для создания этой реализации для вас.

Long count(Date from,Date to, String searchQuery) {
    Number n = em.createNativeQuery("... that query")
            .setParameter("from", from, TemporalType.DATE) // assuming that's a Date, and not TimeStamp
            .setParameter("to", to, TemporalType.DATE)
            .setParameter("searchQuery", "")
            .setParameter("searchQuery", searchQuery)
            .getSingleResult();
    return n.longValue();
}

Первый вызов .setParameter("searchQuery", "")сообщает Hibernate, какой это тип, следующий задает значение.

Проблема заключается в том, что Postgres выполняет проверку типов во время синтаксического анализа, а не откладывает ошибку в случае, если набор параметров равен нулю.

0 голосов
/ 25 сентября 2018

Нельзя использовать like null

SELECT count(*) FROM analysis_history ah, analysis_group ag 
WHERE ah.analysis_group_id = ag.id AND ah.creation_date 
BETWEEN :from AND :to AND ag.name LIKE :searchQuery

И вы передаете '%' в searchQuery, когда параметр searchQuery имеет значение null?например,

repository.count(from, to, searchQuery == null ? "%" : searchQuery);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...