【问题标题】:Spring Data native query with params don't work带有参数的 Spring Data 本机查询不起作用
【发布时间】:2020-12-10 20:15:36
【问题描述】:

我有一个类似于以下的本机查询:

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

【问题讨论】:

  • 首先从查询中删除所有\n。其次,我认为这不起作用 tmp.?5。尝试将其删除以进行测试
  • 删除了每个\n,我在注释中放置了静态查询并且它工作但是当我开始弄乱参数时它会报错
  • 使用?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 * (......)
  • 问题出在格式上。尝试在 d.surname 之后留出空格。
  • 在应用您的建议后,我已经用最新的错误更新了这个问题 - 仍然没有设法使它工作..

标签: java hibernate spring-data-jpa nativequery


【解决方案1】:

如果EmployeeStatusenum,则必须在查询中使用它

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

【讨论】:

  • 是的,EmployeeStatus 是枚举,我尝试了使用和不使用 .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
  • @digitalis 您可以尝试将status 作为字符串@Param("status") String status 传递吗?
猜你喜欢
  • 2019-04-15
  • 2020-11-26
  • 1970-01-01
  • 2017-04-21
  • 2015-03-20
  • 2019-10-09
  • 1970-01-01
  • 2018-08-16
  • 2018-01-27
相关资源
最近更新 更多