2017-05-02 2 views
1

Il y a des questions similaires ici mais aucune d'elles n'a fonctionné dans mon cas. J'ai un SQL personnalisé qui renvoie 2 colonnes: une chaîne, un numéro. Et la colonne de chaîne est toujours un nom ENUM majuscule complet. Je veux nourrir ce jeu de résultats dans mon haricot personnalisé qui a ladite énumération.Échec de la transformation Hibernate Custom SQL Enum

Après la réponse here pour Hibernate 5.X, le code est ci-dessous

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

Ce code n'exécute même pas la méthode de Query.list(), il échoue à cette ligne:

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

trace d'exception:

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

Donc, hiberner tente d'appeler MyEnumClass.class.newInstance() et échouer. Il ne vérifie même pas les propriétés que j'ai transmises. En utilisant Hibernate 5.1.0.Final, je ne suis pas censé utiliser le type personnalisé de cette façon?

Répondre

1

J'ai trouvé une façon de le faire:

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