使用Longs的MyBatis动态SQL

时间:2013-11-07 23:31:47

标签: java sql mybatis dynamic-sql

我正在从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的值

如何让它发挥作用?

3 个答案:

答案 0 :(得分: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的答案也会有效。

答案 1 :(得分:1)

在界面中注释参数,例如

public interface SomeDao {

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

}

答案 2 :(得分:0)

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

根据{{​​3}},

原始类型long的MyBatis别名为_long

尝试使用

<select id="selectTotalRegionCountForGbs" parameterType="_long" resultType="java.lang.Long">