Hibernate - 使用具有枚举属性的Bean的本机查询和别名?

时间:2011-07-21 19:20:20

标签: java sql hibernate

我在使用hibernate中的本机查询时遇到了麻烦,无法为包含枚举属性的bean设置别名。调用query.list()时,我收到一个InvocationTargetException。我的例子如下:

@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使用什么类型(枚举类型)。 Hibernate.String不起作用!我也试图完全关闭类型(query.addScalar(“col3”))但我得到了相同的InvocationTargetException。任何人都可以帮我解决这个问题吗?我的模型无法更改,我坚持使用本机SQL查询。任何想法都表示赞赏。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

首先,你不应该使用

private EnumType prop3;

private ActualEnum prop3;

ActualEnum是您自己的枚举类型(例如Fruits来区分苹果和橙子)。

其次,当你使用本机sql时,你的hibernate映射是无关紧要的。

现在,我可以提出几种选择。您可以尝试使用addEntity()而不是一堆标量。 Hibernate可能会识别枚举属性并正确映射。

其他选项是让非公共setter从数据库中获取字符串,将其转换为枚举并设置实际属性。

最后,您可以自定义变压器。但这可能是最复杂的选择。