#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, а затем просто передать дату для сравнения.