Ibatis:There is no READABLE property named 'userName' in class 'java.lang.String

4645 ワード

ibatis-xx.xmlでは、次の構成が表示されます.
 
 
[html]
view plain
copy
print
?
  • select * from t_user

  • where
  • 1=1


  • instr(name,#userName#)>0

  • <select id="selectAllUsers" resultClass="User" parameterClass="java.lang.String">
    		select * from t_user
    		where
    			1=1
    		<dynamic>
    			<isNotEmpty prepend="and" property="userName">
    				  instr(name,#userName#)>0
    			</isNotEmpty>
    		</dynamic>
    </select>
    

     
     
    このファジイクエリを実行すると、exception:com.ibatis.common.beans.ProbeException: There is no READABLE property named 'userName' in class 'java.lang.String';
     
    次の構成と比較します.
     
    [html]
    view plain
    copy
    print
    ?
  • select * from t_user

  • where
  • 1=1


  • instr(name,#userName#)>0

  • <select id="selectAllUsers" resultClass="User" parameterClass="User">
    		select * from t_user
    		where
    			1=1
    		<dynamic>
    			<isNotEmpty prepend="and" property="userName">
    				 instr(name,#userName#)>0
    			</isNotEmpty>
    		</dynamic>
    </select>

    上記の構成はクエリーを正常に実行できるのでibatisはxmlをsqlに解析する際にparameterClassのgetter propertyメソッドを探していると推測され、第2のcaseではuserName propertyはparameterClass Userの属性であるため、正常にsqlに解析してクエリー操作を実行することができ、このようにして、第1のcaseではparameterClassはStringクラスであり、propertyはuserNameであり、StringはuserNameのgetterメソッドが見つからず、このため、上記赤色の箇所の異常情報が表示されます.
     
     
    以上は個人の憶測にすぎず、その原理をよく知っている面倒があれば教えてくれる.
     
    注意:parameterClassがUserオブジェクトではなくStringに設定したい場合は、次の構成(propertyを省略またはvalueに設定)も使用できます.
     
    [html]
    view plain
    copy
    print
    ?
  • select * from t_user

  • where
  • 1=1


  • instr(name,#userName#)>0