Hibernate - Использовать собственный запрос и псевдоним для Bean со свойствами enum? - PullRequest
6 голосов
/ 21 июля 2011

У меня проблемы с использованием собственного запроса в hibernate для псевдонима bean-компонента, содержащего свойства enum.Я получаю InvocationTargetException при вызове query.list ().Мой пример ниже:

@Entity(name = "table1")
public class Class1 {
    @Column(name = "col1")
    @NotNull
    private Integer prop1;

    @Column(name = "col2")
    @NotNull
    private String prop2;

    @Column(name = "col3", length = 6)
    @Enumerated(value = EnumType.STRING)
    private MyEnumType prop3;

    // ... Getters/Setters...
}

public List getClass1List(){
    String sql = "select col1 as prop1, col2 as prop2, col3 as prop3 from table1";

    Session session = getSession(Boolean.FALSE);
    SQLQuery query = session.createSQLQuery(sql);
    query.addScalar("col1", Hibernate.INTEGER);
    query.addScalar("col2", Hibernate.STRING);
    query.addScalar("col3", Hibernate.STRING);

    query.setResultTransformer(Transformers.aliasToBean(Class1.class));

    return query.list();
}

Во время вызова query.addScalar ("col3", Hibernate.STRING) я не знаю, какой тип использовать для col3 (тип enum).Hibernate.String не работает!Я также попытался полностью исключить тип (query.addScalar ("col3")), но получаю то же исключение InvocationTargetException.Кто-нибудь может мне помочь с этим?Моя модель не может быть изменена, и я застрял с нативный запрос SQL.Любые идеи приветствуются.

Ответы [ 2 ]

3 голосов
/ 02 мая 2012
// In public List getClass1List() method:
// 1. DEFINE:
Properties params = new Properties();
params.put("enumClass", "enumerators.MyEnumType");
params.put("type", "12");

// 2. REPLACE: 
// query.addScalar("col3", Hibernate.STRING);
// X

query.addScalar("col3", Hibernate.custom(org.hibernate.type.EnumType.class, params));
2 голосов
/ 22 июля 2011

Во-первых, вы не должны использовать

private EnumType prop3;

но

private ActualEnum prop3;

Где ActualEnum - ваш собственный тип перечисления (например, Fruits для различения яблок и апельсинов).

Во-вторых, ваше отображение hibernate не имеет значения, когда вы используете нативный sql.

Теперь есть пара вариантов, которые я могу предложить. Вы можете попробовать использовать addEntity() вместо набора скаляров. Возможно, что Hibernate распознает свойство enum и отобразит правильно.

Другой вариант - иметь не общедоступный установщик, который бы брал строку из базы данных, преобразовывал ее в enum и устанавливал фактическое свойство.

Наконец, вы можете настроить трансформатор. Но это, наверное, самый сложный вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...