Привязка @param в собственном запросе репозитория Jpa внутри отдельных предложений

#java #hibernate #jpa #spring-data-jpa

#Ява #зимовать #jpa #весна-данные-jpa

Вопрос:

Я ищу способ привязать заданный параметр в собственном запросе, где значение должно находиться в одинарных кавычках, например так:

 @Transactional(readOnly = true) @Query(value = " SELECT c.ID "    " FROM table1 clh "    " LEFT JOIN table2 nks "    " on clh.SERIAL = nks.SERIAL_REF "    " WHERE clh.CREATED_DATE gt;= :now - interval ':timeThreshold' HOUR "    " AND nks.SERIAL_REF IS NULL" , nativeQuery = true) Listlt;Longgt; getIdsWithoutAnswer (@Param("timeThreshold") Integer timeThreshold, @Param("now") LocalDateTime now);  

Однако, когда я пытаюсь запустить это, это приводит к тому, что hibernate не может привязать значение порога времени, как это предусмотрено внутри отдельных цитат «.

Кто-нибудь знает, как это можно решить?

Комментарии:

1. Какова ваша база данных SQL (например, MySQL, Postgres, Oracle) ?

2. Попробуйте удалить кавычки. Но я даже не уверен, что у вас там могут быть переменные привязки?

3. @TimBiegeleisen в этом случае я использую Oracle.

4. @SimonMartinelli Я попытался удалить кавычки, но затем он жалуется на неправильный синтаксис при попытке выполнить запрос. Я также попытался передать его в виде строки вместо этого, как с одиночными кавычками, так и без них; тоже не сработало 🙁

Ответ №1:

Проблема, с которой вы столкнулись с вашим собственным запросом Oracle, связана с попыткой привязать значение к интервальному литералу. Ты не можешь этого сделать. Вместо этого используйте NUMTODSINTERVAL() функцию:

 @Transactional(readOnly = true) @Query(value = " SELECT c.ID "    " FROM table1 clh "    " LEFT JOIN table2 nks "    " on clh.SERIAL = nks.SERIAL_REF "    " WHERE clh.CREATED_DATE gt;= :now - numtodsinterval(:timeThreshold, 'hour') "    " AND nks.SERIAL_REF IS NULL" , nativeQuery = true) Listlt;Longgt; getIdsWithoutAnswer (@Param("timeThreshold") Integer timeThreshold, @Param("now") LocalDateTime now);  

Комментарии:

1. Ах, я понимаю — похоже, это сработало; спасибо. Я также понял, что еще один способ сделать это-предварительно определить дату, вычитая часовой порог из свойства LocalDateTime, а затем просто передать дату для сравнения.