Spring DATA JPA 传递两个参数 - 无法提取 ResultSet;SQL [n/a]; org.hibernate.exception.SQLGrammerException:无法提取结

Posted

技术标签:

【中文标题】Spring DATA JPA 传递两个参数 - 无法提取 ResultSet;SQL [n/a]; org.hibernate.exception.SQLGrammerException:无法提取结果集【英文标题】:Spring DATA JPA Passing two parameters -could not extract ResultSet;SQL [n/a]; org.hibernate.exception.SQLGrammerException:could not extract ResultSet 【发布时间】:2021-11-10 18:47:01 【问题描述】:

我已经编写了以下 Spring Data JPA 原生查询。

@Query(value = "SELECT ID, REFERENCE FROM ORDER_MATCH where ORDER_REF IN :orderRef AND STATUS = :status", nativeQuery = true)
List<Object[]> retriveData(List<String> orderRef, String status);

这段代码给了我以下错误。

SQL Error : 936, SQLState : 42000
ORA-00936 : missing expression
org.springframework.dao.InvalidDataAccessResourceUsageException : could not extract ResultSet; SQL[n/a]; nested exception is org.hibernate.exception.SQLGrammerException: could not extract ResultSet

但是,如果我删除了一个参数,则代码可以正常工作,例如,以下两种组合可以正常工作,当我有两个参数时会出现问题,任何人都可以帮助我确定这里出了什么问题。非常感谢您。

一个参数的工作组合

@Query(value = "SELECT ID, REFERENCE FROM ORDER_MATCH where ORDER_REF IN :orderRef" , nativeQuery = true)
List<Object[]> retriveData(List<String> orderRef);

@Query(value = "SELECT ID, REFERENCE FROM ORDER_MATCH where STATUS = :status", nativeQuery = true)
List<Object[]> retriveData(String status);

只是为了添加更多细节,我使用了 :?传递参数的方式,它也会导致同样的错误

    @Query(value = "SELECT ID, REFERENCE FROM ORDER_MATCH where ORDER_REF IN (?1) AND STATUS = ?2", nativeQuery = true) 
List<Object[]> retriveData(List<String> orderRef, String status);

【问题讨论】:

您是否尝试过记录实际生成的 SQL 查询? 是的,我做到了,这是非常好的 sql 查询,我可以在 SQL 开发人员上运行传递参数 【参考方案1】:

试试这样的:

@Query(value = "SELECT ID, REFERENCE FROM ORDER_MATCH where ORDER_REF IN :orderRef AND STATUS = :status", nativeQuery = true)
List<Object[]> retriveData(@Param("orderRef") List<String> orderRef, @Param("status") String status);

还请注意,正如hibernate documentation 中所述:

值列表可以来自许多不同的来源。在constructor_expressioncollection_valued_input_parameter 中,值列表不能为空;它必须包含至少一个值。

【讨论】:

你是完全正确的,值列表没有值,因此导致了这个问题......

以上是关于Spring DATA JPA 传递两个参数 - 无法提取 ResultSet;SQL [n/a]; org.hibernate.exception.SQLGrammerException:无法提取结的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA - 将列名和值作为参数传递

Spring Data JPA 中的动态查询

Spring Data JPA - 使用 REST 调用上的查询参数从方法名称生成查询

Spring-data-jpa介绍

Spring Boot中的JPA @query中没有传递参数[重复]

Spring Data JPA 忽略空参数