I want to have a method that finds a specific value from a column of a specific table in a database, where the column name is passed as a parameter. Thus, the Java method will have the following signature:
public Integer getFoo(String column) throws DataAccessException;
My match attempt for this query is as follows:
<select id="getFoo" parameterClass="java.lang.String" resultClass="java.lang.Integer">
select min($column$) from daily_statistics where $column$ > 0
</select>
This is not so interesting. If I call this method once, it will work. But if I name it twice with different column names, the second call will fail with the following stack trace:
Caused by: com.ibatis.common.jdbc.exception.NestedSQLException:
Caused by: java.sql.SQLException: Invalid column name
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:181)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:100)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:97)
at org.springframework.orm.ibatis.SqlMapClientTemplate$1.doInSqlMapClient(SqlMapClientTemplate.java:273)
at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:209)
... 21 more
Note that 'FIRST_COLUMN' represents the name of the first column, even if an error occurs in the second call, never on the first call.
I found that the following comparison will not give errors even when called several times:
<select id="getFoo" parameterClass="java.lang.String" resultClass="java.lang.Integer">
select min(ANY_COLUMN) from daily_statistics where $column$ > 0
</select>
, , select.