There is no getter for property named '*' in 'class java.lang.String' 錯誤的解決方法如網上所說有兩種:
1.將具體報錯的變量名更換爲_parameter, 如:
報錯代碼如下:
<select id="getRiskMember" resultMap="BaseResultMap" parameterType="String">
select t.username from tab where 1=1
<if test="username != null">
and username = #{username}
</if>
</select>
修正如下:
<select id="getRiskMember" resultMap="BaseResultMap" parameterType="String">
select t.username from tab where 1=1
<if test="_parameter!= null">
and username = #{username}
</if>
</select>
2.在接口的java文件中,增加參數設置:
修改前:getLoginUserByUsername(String username);
修改後:getLoginUserByUsername(@Param(value="username") String username);
較好的一個引用:https://blog.csdn.net/qing_gee/article/details/47122227
------------------------------------------------------------------------華麗的分割線-----------------------------------------------------------------------------------------但是
當遇到嵌套查詢,情況就複雜了。嵌套查詢時,使用 方法2 在第一層查詢的時候可以正常起作用,但如果是嵌套調用時,需要配合方法1 和 方法2。具體如下。
嵌套關係如下:
<resultMap id="BaseResultMap" type="com.yldev.framework.model.LoginUser">
<!--省略其他普通屬性-->
<collection property="roleCodeList" ofType="java.lang.String" javaType="java.util.ArrayList" select="getRoleCodesByAccount" column="id"> </collection>
<collection property="authCodeList" ofType="java.lang.String" javaType="java.util.ArrayList" select="getAuthCodesByAccount" column="id"> </collection>
</resultMap>
3個<select>標籤的配置如下:
<select id="getLoginUserByAccount" parameterType="java.lang.String" resultMap="BaseResultMap" >
SELECT
u.id
FROM tab1 u
where 1=1
<if test="account != null and account !='' "> <!--第一層查詢,與interface綁定,所以直接@Param指定-->
and u.account=#{account}
</if>
</select>
<select id="getRoleCodesByAccount" parameterType="java.lang.String" resultType="java.lang.String">
SELECT
role.role_code from tab2
WHERE 1 = 1
<if test="_parameter !=null and _parameter !=''"> <!--第二層查詢,由第一層自動調用,所以不能顯示使用參數,必須用"_parameter" -->
and urole.user_id = #{id}
</if>
</select>
<select id="getAuthCodesByAccount" parameterType="java.lang.String" resultType="java.lang.String">
SELECT
auth.auth_code authCode from tab3
where 1=1
<if test="_parameter !=null and _parameter !=''"><!--第二層查詢,由第一層自動調用,所以不能顯示使用參數,必須用"_parameter" -->
and urole.user_id = #{id}
</if>
</select>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
綜上所得:
由於mybatis的嵌套查詢,當二層嵌套<select>會被自動調用執行,在使用<if>或者<when>時,必須使用"_parameter"作爲參數的判斷,不能使用具體的參數名。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
額外知識點:
1. <collection property="roleCodeList" ofType="java.lang.String" javaType="java.util.ArrayList" select="getRoleCodesByAccount" column="id"> </collection>中的column="id"表示的是,會將第一層查詢出來的id的值作爲參數傳入第二層<select>中。
2.嵌套查詢有兩種方式:一是一條sql完成全部事情;二是分成幾個<select>, 在<collection>中select="getRoleCodesByAccount" 指定。