Mybatis:嵌套查詢時There is no getter for property named '*' in 'class java.lang.String

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" 指定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章