我正在从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的值
如何让它发挥作用?
答案 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将您的参数视为常规对象,而不是基本类型或基本类型包装。
原始类型long
的MyBatis别名为_long
。
尝试使用
<select id="selectTotalRegionCountForGbs" parameterType="_long" resultType="java.lang.Long">