2017-08-20 3 views
-1

Mybatisコードが列挙型(バージョン:3.4.4)を読み込みません。Mybatis enum idで選択

私はデータベースにINT(11)タイプのcartypeフィールドを持つテーブルを持っています。 Javaでは 私は車の種類を処理するためにENUMを作成しました:

<select id="selectCar" parameterType="Car" resultMap="carResultMap"> 
SELECT * FROM Cars WHERE car_name="#{carName}"; 
</select> 

<resultMap id="carResultMap" type="Car"> 
<id property="id" column="car_name"/> 
<result property="carType" column="cartype"/> 
</resultMap> 

最後に私のBeanは以下のようになります:

public enum CarType { 
SEDAN(1), LIMUSIN(2), WAGON(3); 

private int id; 

CarType(int id) { 
this.id = id; 
} 

public int getId() { 
return this.id; 
} 

カーマッパーXMLは、この(何もすべてのデータが含まれていない)のように見えます

public class Car { 
private Integer id; 
private CarType carType; 
} 

Beanにはゲッターとセッターも含まれています。

私はJavaで車を取得しようとすると、それは次の例外をthorws:java.lang.IllegalArgumentExceptionが:によって引き起こさ ません列挙型定数org.data.bean.CarType.1 java.lang.Enum.valueOfでORGでorg.apache.ibatis.type.EnumTypeHandler.getNullableResult(EnumTypeHandler.java:26) でorg.apache.ibatis.type.EnumTypeHandler.getNullableResultで(Enum.java:238) (EnumTypeHandler.java:49) .apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:66)

+0

とMaven:ので(私もサンプルタイプハンドラの定義を含めています)のようなのJavaTypeパラメータを追加します。それは簡単に実行することができます。私はまたそれが列挙型の名前だと思う(例えば、 "SEDAN"はIDではなくデータベースに格納する必要があります) – DPM

+0

idの代わりにenum名で作業してくれてありがとう。 select文では、名前のためにUPPER()メソッドを使用します。 – stuckhelper

答えて

1

idではなくデータベースに格納する必要があるenum名です。

hereをご覧ください。デフォルトのEnumTypeHandlerでは、varchar:

VARCHARコードが格納されている(インデックスではない)ため、VARCHARが必要です。

IDを保存したい場合は、カスタムTypeHandlerが必要です。このような何か:

public class CarTypeTypeHandler implements TypeHandler<CarType> { 

    public void setParameter(PreparedStatement ps, int paramInt, CarType paramType, JdbcType jdbctype) 
     throws SQLException { 
     ps.setInt(paramInt, paramType.getId()); 
    } 

    @Override 
    public CarType getResult(ResultSet rs, String param) throws SQLException { 
     return CarType.get(rs.getInt(param)); 
    } 

    @Override 
    public CarType getResult(CallableStatement cs, int col) throws SQLException { 
     return CarType.get(cs.getInt(col)); 
    } 
} 

あまりにもあなたの列挙内のルックアップメソッドを持っていると便利になります。

public static CarType get(int code) { 
    for(CarType s : values()) { 
     if(s.id == code) return s; 
    } 
    return null; 
} 

また、あなたのマッパーで明示的に列挙型を示すために必要があるかもしれません。 (メモリに)H2データベースを例 - あなたは-forで、最小限の、完全な例を構築し、ここにリンクしようとすることができ

<result property="carType" 
    column="cartype" javaType="path.to.package.CarType" 
    typeHandler="path.to.package.CarTypeTypeHandler"/> 
+0

私はそれを試しましたが、残念ながらそれは動作しません。 – stuckhelper

+0

@stuckhelper私の最初の返信を更新しました – DPM

+0

idの代わりにenum名を付けていただきありがとうございます。 select文では、名前のためにUPPER()メソッドを使用します。 – stuckhelper