Собственный запрос Spring Data с параметрами не работает

#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 ?