3

我正在从 iBatis 迁移到 myBatis,并且在转换过程中,我曾经有过可以使用的查询,但现在不行了。我一直用头撞墙的时间比我想承认的要让它工作的时间更长。

iBatis 中的查询是:

<select id="countForACol" parameterClass="java.lang.Long" resultClass="java.lang.Long">
    SELECT
        COUNT(1) AS 'val'
    FROM
        someTable WITH(NOLOCK)
    <isParameterPresent prepend="WHERE">
        someCol = #colId#
    </isParameterPresent>
</select>

现在,我已将其翻译成如下所示的查询:

<select id="selectTotalRegionCountForGbs" parameterType="Long" resultType="java.lang.Long">
    SELECT
        COUNT(1) AS 'val'
    FROM
        someTable WITH(NOLOCK)
    <where>
        <if test="colId != null">
            someCol = #{colId}
        </if>
    </where>
</select>

然而,这不起作用。我尝试运行它时收到的错误是:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'colId' in 'class java.lang.Long'
Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'colId' in 'class java.lang.Long'

我可以说它正在尝试将 Long 对象视为具有称为“getColId”的 getter 的对象,但我不知道如何向 MyBatis 发出信号以使用 Long 的值。

我怎样才能让它工作?

4

3 回答 3

4

我能够通过这样做来解决问题:

<select id="selectTotalRegionCountForGbs" parameterType="Long" resultType="java.lang.Long">
    SELECT
        COUNT(1) AS 'val'
    FROM
        someTable WITH(NOLOCK)
    <where>
        <if test="value != null">
           someCol = #{colId}
        </if>
    </where>
</select>

我将测试更改为使用“value”而不是“colId”,并且效果很好。

我相信@jdevelop 和@Michal Rybak 的答案也会起作用。

于 2013-11-08T14:13:41.353 回答
1

在界面中注释参数,例如

public interface SomeDao {

  Long selectTotalRegionCountForGbs(@Param("colId") long someId);

}
于 2013-11-07T23:48:49.990 回答
0

我假设parameterType="Long"MyBatis 将您的参数视为常规对象,而不是原始类型或原始类型包装器。

根据文档,原始类型的 MyBatis 别名long是。_long

尝试使用

<select id="selectTotalRegionCountForGbs" parameterType="_long" resultType="java.lang.Long">
于 2013-11-07T23:45:17.077 回答