如何在select子句中使用参数化列映射iBATIS的查询?

时间:2011-05-26 13:46:07

标签: java sql orm persistence ibatis

我希望有一个方法从数据库中特定表的列中查找某个值,其中列的名称作为参数传入。因此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$ &gt; 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$ &gt; 0
</select>

因此,问题似乎与在select子句中使用参数化列有关。

1 个答案:

答案 0 :(得分:6)

在SQL查询中使用别名。这应该解决将结果映射回java的问题。