Как отобразить запрос для iBATIS с параметризованным столбцом в предложении select?
Я хочу иметь метод, который находит определенное значение из столбца конкретной таблицы в базе данных, где имя столбца передается в качестве параметра. Таким образом, метод Java будет иметь следующую подпись:
public Integer getFoo(String column) throws DataAccessException;
Моя попытка сопоставления для этого запроса заключается в следующем:
<select id="getFoo" parameterClass="java.lang.String" resultClass="java.lang.Integer">
select min($column$) from daily_statistics where $column$ > 0
</select>
Это терпит неудачу интересным способом. Если я вызываю этот метод один раз, он работает. Но если я вызову его дважды с разными именами столбцов, второй вызов завершится неудачно со следующей трассировкой стека:
Caused by: com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in com/company/project/dao/ibatis/maps/FooBar.xml.
--- The error occurred while applying a result map.
--- Check the getSomething-AutoResultMap.
--- Check the result mapping for the 'MIN(FIRST_COLUMN)' property.
--- Cause: java.sql.SQLException: Invalid column name
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
Обратите внимание, что "FIRST_COLUMN" представляет имя первого столбца, даже если ошибка возникает при втором вызове, а не при первом вызове.
Я обнаружил, что следующее отображение не даст ошибок, даже если вызывается несколько раз:
<select id="getFoo" parameterClass="java.lang.String" resultClass="java.lang.Integer">
select min(ANY_COLUMN) from daily_statistics where $column$ > 0
</select>
Таким образом, похоже, что проблема связана с использованием параметризованного столбца в предложении select.
1 ответ
Используйте псевдоним в запросе SQL. Это должно решить проблему отображения результата обратно в Java.