I am relatively new to Spring JDBC, and face a problem when running my code:
@Repository
public class PersonDAO {
JdbcTemplate jdbcTemplate;
@Transactional
public List<Long> getAnyIntegerColumn(String column){
var query = jdbcTemplate.query("select ? from people", ps -> ps.setString(1, "ssn"),(rs, rowNum) -> rs.getLong("ssn"));
return query;
}
I do get the following exception:
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [select ssn from ?]; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT SSN FROM ?[*]"; expected "identifier"; SQL statement:
select ssn from ? [42001-200]
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:239)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)
at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:713)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:744)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:799)
at coding.dojo.jdbc.dao.PersonDAO.getAnyIntegerColumn(PersonDAO.java:75)
at coding.dojo.jdbc.dao.PersonDAO$$FastClassBySpringCGLIB$$b85877e8.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698)
at coding.dojo.jdbc.dao.PersonDAO$$EnhancerBySpringCGLIB$$94719a61.getAnyIntegerColumn(<generated>)
at coding.dojo.jdbc.JdbcApplicationTests.lambda$testAnyColumnQuery$1(JdbcApplicationTests.java:63)
My testdatabase is H2.
I cannot explain this. When I run the exact same code, but simply omit the PreparedStatementSetter, and use the query "select ssn from people", everything works fine.
I fail to grasp what is going on here.