Java ORA-00900:无效的SQL语句-NamedParameterJdbcTemplate

Java ORA-00900:无效的SQL语句-NamedParameterJdbcTemplate,java,jdbctemplate,Java,Jdbctemplate,我将此查询作为属性常量: get.policy.list=SELECT policy FROM table WHERE policy IN (:policyList) AND state = :state 从jdbcTemplate馈送和获取列表时,我得到: 原因:java.sql.SQLSyntaxErrorException:ORA-00900:无效的sql 声明 在try块内的第一行上 @Override public List<MyVO> areValidPolic

我将此查询作为属性常量:

get.policy.list=SELECT policy FROM table WHERE policy IN (:policyList) AND state = :state
从jdbcTemplate馈送和获取列表时,我得到:

原因:java.sql.SQLSyntaxErrorException:ORA-00900:无效的sql 声明

在try块内的第一行上

@Override
    public List<MyVO> areValidPolicies(String state, List<String> policyList) {

        MapSqlParameterSource namedParameters = new MapSqlParameterSource().addValue("state", state)
                .addValue("policyList", policyList);

        List<MyVO> retrievedPolicyList = new ArrayList<MyVO>();

        try{
            retrievedPolicyList = myNamedJdbcTemplate.query("SELECT policy FROM table WHERE policy IN (:policyList) AND state = :state", namedParameters, new RowMapper<MyVO>() {

                        @Override
                        public MyVO mapRow(ResultSet rs, int rowNum) throws SQLException {
                            MyVO myVO = new MyVO();
                            MyVO.setPolicy(rs.getString("policy"));
                            return myVO;
                        }
                    });
        } catch (Exception ex){
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }

        retrievedPolicyList.stream().forEach(System.out::println);

        return retrievedPolicyList;
    }
@覆盖
公共列表是有效的策略(字符串状态、列表策略列表){
MapSqlParameterSource namedParameters=新的MapSqlParameterSource().addValue(“状态”,状态)
.addValue(“保单列表”,保单列表);
List retrievedPolicyList=新建ArrayList();
试一试{
retrievedPolicyList=myNamedJdbcTemplate.query(“从表中选择策略,其中策略位于(:policyList)中,状态=:state”),namedParameters,new RowMapper(){
@凌驾
公共MyVO映射行(ResultSet rs,int rowNum)抛出SQLException{
MyVO MyVO=新的MyVO();
MyVO.setPolicy(rs.getString(“policy”);
返回myVO;
}
});
}捕获(例外情况除外){
System.out.println(例如getMessage());
例如printStackTrace();
}
retrievedPolicyList.stream().forEach(System.out::println);
返回检索的策略列表;
}
堆栈跟踪

 org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [get.policy.list]; nested exception is java.sql.SQLSyntaxErrorException: ORA-00900: invalid SQL statement

    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:649)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:684)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:711)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:761)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:192)
    at com.project.policyImpl.areValidPolicies(ESRepublishDaoImpl.java:56)
    at com.project.policyImpl$$FastClassBySpringCGLIB$$683fad37.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;错误的SQL语法[get.policy.list];嵌套异常为java.sql.SQLSyntaxErrorException:ORA-00900:无效的sql语句
位于org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231)
位于org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
位于org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:649)
位于org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:684)
位于org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:711)
位于org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:761)
位于org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:192)
在com.project.policyImpl.AreValidPolicys(ESRepublishDaoImpl.java:56)
在com.project.policyImpl$$FastClassBySpringCGLIB$$683fad37.invoke()上
位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
位于org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:157)上
位于org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:179)上
位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)

请指导我哪里出错。

是SQL中的保留字。我建议重命名该表以避免将来的麻烦,但如果这不是一个选项,您可以使用双引号(
)来避免它:

retrievedPolicyList=
myNamedJdbcTemplate.query(“从\“表\”中选择策略,其中策略位于(:policyList)中,状态=:state”,namedParameters,new RowMapper(){
//这里--------------------------------------^^-----^^

是否尝试对所选表使用别名,如:“从表t中选择t.policy,其中t.policy位于(:policyList)中,t.state=:state?”“?是的@SándorJuhos。不起作用。你是否尝试打开SQL语句日志记录,查看你的Spring应用程序在数据库的引擎盖下调用了什么?感谢@Mureinik的回复。但表不是我的确切表。我已将其重命名为示例。
 retrievedPolicyList = 
     myNamedJdbcTemplate.query("SELECT policy FROM \"table\" WHERE policy IN (:policyList) AND state = :state", namedParameters, new RowMapper<MyVO>() {
     // Here --------------------------------------^^-----^^