2017-08-20 3 views
-1

Mein mybatis-Code lädt nicht enum-Typ (Version: 3.4.4).Mybatis enum nach ID auswählen

In Mysql Datenbank habe ich eine Tabelle mit Cartype Feld, das ein INT (11) Typ ist. In Java habe ich eine ENUM für Autotypen Handhabung:

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

private int id; 

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

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

Car-Mapper xml sieht wie folgt aus (enthält nicht alle Daten):

<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> 

Schließlich meine Bohne wie die Anhänger aussehen:

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

Die Bean enthält auch Getter und Setter.

Wenn ich versuche, das Auto in Java, um es thorws die folgende Ausnahme: Verursacht durch: java.lang.IllegalArgumentException: Keine Aufzählungskonstante org.data.bean.CarType.1 bei java.lang.Enum.valueOf (Enum.java:238) bei org.apache.ibatis.type.EnumTypeHandler.getNullableResult (EnumTypeHandler.java:49) bei org.apache.ibatis.type.EnumTypeHandler.getNullableResult (EnumTypeHandler.java:26) bei org .apache.ibatis.type.BaseTypeHandler.getResult (BaseTypeHandler.java:66)

+0

Sie könnten versuchen, Gebäude und verbinden hier ein minimales, komplettes Beispiel mit -für h2 Datenbank Beispiel- (im Speicher) und Maven so kann es leicht gelaufen werden. Ich denke auch, dass es der Name des Enums ist (also zum Beispiel "SEDAN", das in der Datenbank gespeichert werden muss, nicht die ID) – DPM

+0

Danke, es ist Arbeit mit dem Namen enum anstelle von id. In SELECT-Anweisung sollte die UPPER() -Methode für den Namen verwendet werden, es ist ein kleines Plus für die Lösung. – stuckhelper

Antwort

1

Es ist der Enum-Name, der in der Datenbank gespeichert werden muss, nicht die ID.

Werfen Sie einen Blick here. Der Standard-EnumTypeHandler erwartet ein varchar:

VARCHAR jeder String kompatibel Typ, wie der Code gespeichert ist (nicht Index).

Wenn Sie die ID speichern möchten oder müssen, benötigen Sie eine benutzerdefinierte TypeHandler. Etwas wie folgt aus:

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)); 
    } 
} 

Es ist zweckmäßig, eine Lookup-Methode in Ihrer ENUM zu haben auch:

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

Möglicherweise müssen auch die Enum, um anzuzeigen, explizit in Ihrem Mapper geben. Fügen Sie einen Parameter wie javatype so (ich bin auch auch eine Art Definitions Probe):

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

Ich habe es versucht, aber leider funktioniert es nicht. – stuckhelper

+0

@stuckhelper Ich habe meine ursprüngliche Antwort aktualisiert – DPM

+0

Danke, es ist Arbeit mit dem Namen enum anstelle von ID. In SELECT-Anweisung sollte die UPPER() -Methode für den Namen verwendet werden, es ist ein kleines Plus für die Lösung. – stuckhelper