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 --------------------------------------^^-----^^