0

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.

Mark Rotteveel
  • 90,369
  • 161
  • 124
  • 175
  • 2
    You can't dynamically replace a column or table name with a `PreparedStatement` . You can only replace values. – Arnaud Mar 14 '22 at 07:56

0 Answers0