我有一个如下所示的本机查询:
@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
) 插入参数时,它会停止工作,并出现我上面更新的错误。
如果
EmployeeStatus
是 enum
你必须在查询中使用它
WHERE e.status = :#{#status.name()}
在我的例子中,动态传递的值返回 null,因此查询中未处理的 null 导致了问题。
您可以通过检查调试日志并在查询中传递确切的值来测试空条件来检查这些值。
将以下内容添加到日志的 application.properties 中
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
我的例子是oracle SQL,你可以根据你的数据库来做