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

Posted

技术标签:

【中文标题】如何在选择子句中使用参数化列映射 iBATIS 查询?【英文标题】:How to map query for iBATIS with parameterized column in select clause? 【发布时间】:2011-05-26 13:46:06 【问题描述】:

我希望有一个方法可以从数据库中特定表的列中找到某个值,其中列的名称作为参数传入。因此,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子句中使用了参数化列有关。

【问题讨论】:

在您的 SQL 查询中使用别名。那应该可以解决将结果映射回java的问题。 那行得通。如果你想给出答案,我会接受。如果你不这样做,我会在一天结束前回答自己。 【参考方案1】:

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

【讨论】:

以上是关于如何在选择子句中使用参数化列映射 iBATIS 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在选择语句的“NOT IN”子句中使用逗号分隔的字符串列表作为 pl/sql 存储的函数参数

jqgrid如何自定义化列

iBATIS 将存储过程输出参数设置回 POJO

Mybatis1

MyBatis映射文件

mybatis和ibatis的区别