2017-05-02 6 views
1

Es gibt ähnliche Fragen hier, aber keiner von ihnen funktionierte in meinem Fall. Ich habe eine benutzerdefinierte SQL, die 2 Spalten zurückgibt: eine Zeichenfolge, eine Zahl. Und String-Spalte ist immer ein voller Großbuchstaben ENUM-Name. Ich möchte diese Ergebnismenge in meine benutzerdefinierte Bean füttern, die die genannte Enum hat.Ruhezustand Benutzerdefinierte SQL-Enum-Umwandlung schlägt fehl

die Antwort Nach here für Hibernate 5.X Code unten

Properties params = new Properties(); 
    params.put("enumClass", "MyEnumClass"); 
    params.put("useNamed", true); 
    Type myEnumType = new TypeLocatorImpl(new TypeResolver()).custom(MyEnumClass.class, params); 

    final Query query = getCurrentSession().createSQLQuery(MY_CUSTOM_SQL) 
      .addScalar("col1", myEnumType) 
      .addScalar("col2", StandardBasicTypes.INTEGER) 
      .setLong("someSqlVar", someVal) 
      .setResultTransformer(Transformers.aliasToBean(MyCustomBean.class)); 

    return query.list(); 

Dieser Code selbst query.list() -Methode, versagt es in dieser Zeile nicht ausführen:

Type myEnumType = new TypeLocatorImpl(new TypeResolver()).custom(MyEnumClass.class, params);

Exception-Trace:

Caused by: org.hibernate.MappingException: Unable to instantiate custom type: com.example.MyEnumClass 
... 
Caused by: java.lang.InstantiationException: com.example.MyEnumClass 
... 
Caused by: java.lang.NoSuchMethodException: com.example.MyEnumClass.<init>() 
at java.lang.Class.getConstructor0(Class.java:3082) ~[?:1.8.0_60] 
at java.lang.Class.newInstance(Class.java:412) ~[?:1.8.0_60] 
at org.hibernate.type.TypeFactory.custom(TypeFactory.java:202) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final] 
at org.hibernate.type.TypeFactory.custom(TypeFactory.java:193) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final] 
at org.hibernate.internal.TypeLocatorImpl.custom(TypeLocatorImpl.java:144) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final] 
... 

So versucht Hibernate MyEnumClass.class.newInstance() aufzurufen und fehlgeschlagen. Es prüft nicht einmal nach Eigenschaften, die ich bestanden habe. Kann ich mit Hibernate 5.1.0.Final den benutzerdefinierten Typ nicht auf diese Weise verwenden?

Antwort

1

fand ich einen Weg, es zu tun:

Properties params = new Properties(); 
params.put("enumClass", MyEnumClass.class.getName()); 
params.put("useNamed", true); 

EnumType enumType = new EnumType(); 
enumType.setParameterValues(params); 
CustomType customType = new CustomType(enumType); 

final Query query = getCurrentSession().createSQLQuery(MY_CUSTOM_SQL) 
    .addScalar("col1", customType) 
    .addScalar("col2", StandardBasicTypes.INTEGER) 
    .setLong("someSqlVar", someVal) 
    .setResultTransformer(Transformers.aliasToBean(MyCustomBean.class)); 

return query.list(); 
Verwandte Themen