#java #hibernate #spring-data-jpa #nativequery
#java #переход в спящий режим #spring-data-jpa #nativequery
Вопрос:
У меня есть собственный запрос, подобный следующему:
@Query(value = "SELECT * FROM ("
" SELECT result.*, ROWNUM rn FROM ("
" SELECT tmp.* FROM ("
" SELECT "
" e.id, "
" e.employee_number, "
" d.name, "
" d.surname "
" FROM employee e INNER JOIN detail d ON e.id_detail = d.id "
" WHERE e.status = :status "
" ) tmp "
" ORDER BY :sortColumn :sortDirection "
" ) result "
" WHERE ROWNUM <= (:pageIndex :pageSize) "
") "
"WHERE rn > :pageIndex "
, nativeQuery = true)
ArrayList<Object> getEmployeeDetails( @Param("status") EmployeeStatus status,
@Param("pageSize") int pageSize,
@Param("pageIndex") int pageIndex,
@Param("sortDirection") String sortDirection,
@Param("sortColumn") String sortColumn);
и я получаю следующие ошибки:
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
// ...
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
// ...
Caused by: java.sql.SQLSyntaxErrorException: ORA-01745: invalid host/bind variable name
Что я попробовал, так это другой возвращаемый тип (и мне не удалось выяснить, какой из них использовать в конечном итоге), вставив параметры с @Param()
аннотациями.
Сам запрос работает — я попробовал его непосредственно в базе данных, но у меня возникли проблемы с его обработкой весной.
Сам запрос для упрощения отладки:
SELECT * FROM (
SELECT result.*, ROWNUM rn FROM (
SELECT tmp.* FROM (
SELECT
e.id,
e.employee_number,
d.name,
d.surname
FROM employee e INNER JOIN detail d ON e.id_detail = d.id
WHERE e.status = 'status'
) tmp
ORDER BY tmp.name desc
) result
WHERE ROWNUM <= (0 5)
)
WHERE rn > 0
Редактировать:
Я обновил вопрос предложениями в комментариях по удалению всех n
и проверке на отсутствие пробелов.
Простой запрос без использования каких-либо параметров также работает, но когда я начинаю вставлять параметры через @Param()
аннотации или привязки ( ?1
), он перестает работать, выдавая ошибки, которые я обновил выше.
Комментарии:
1. Сначала удалите все n из запроса. Во-вторых, я не думаю, что это работает tmp.?5. Попробуйте также удалить его для atest
2. удалил все
n
, я поместил статический запрос внутри аннотации, и это сработало, но когда я начал возиться с параметрами, он выдает ошибки3. с помощью
?2
я получаюjava Caused by: org.hibernate.QueryException: Ordinal parameter not bound : 2
и использую:pageSize
—java Caused by: java.lang.IllegalStateException: Using named parameters for method public abstract java.util.ArrayList (.....) but parameter 'Optional[status]' not found in annotated query 'SELECT * (......)
4. Проблема в форматировании. Попробуйте указать пробел после d.фамилия.
5. Я обновил вопрос с последними ошибками после применения ваших предложений — все еще не удалось заставить его работать..
Ответ №1:
если EmployeeStatus
есть enum
, вы должны использовать это в своем запросе
WHERE e.status = :#{#status.name()}
Комментарии:
1. да, EmployeeStatus — это enum, и я пробовал ваше решение с и без
.name()
— в обоих случаях я получил ошибку:org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
2. @digitalis Не могли бы вы попробовать передать
status
как строку@Param("status") String status
?