带参数的 Spring Data 本机查询不起作用

问题描述 投票:0回答:2

我有一个如下所示的本机查询:

@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()
注释的参数。
查询本身确实有效 - 我直接在数据库中尝试过它,但在 Spring 中处理它时遇到了问题。

查询本身方便调试:

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
) 插入参数时,它会停止工作,并出现我上面更新的错误。

java hibernate spring-data-jpa nativequery
2个回答
0
投票

如果

EmployeeStatus
enum
你必须在查询中使用它

WHERE e.status = :#{#status.name()}


0
投票

在我的例子中,动态传递的值返回 null,因此查询中未处理的 null 导致了问题。

您可以通过检查调试日志并在查询中传递确切的值来测试空条件来检查这些值。

将以下内容添加到日志的 application.properties 中

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

我的例子是oracle SQL,你可以根据你的数据库来做

ISNULL 在 Oracle SQL 中等效

© www.soinside.com 2019 - 2024. All rights reserved.