jav*_*ian 6 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();
}
Run Code Online (Sandbox Code Playgroud)
在query.addScalar("col3",Hibernate.STRING)调用期间,我不知道col3使用什么类型(枚举类型).Hibernate.String不起作用!我也试图完全关闭类型(query.addScalar("col3"))但我得到了相同的InvocationTargetException.任何人都可以帮我解决这个问题吗?我的模型无法更改,我坚持使用本机SQL查询.任何想法都表示赞赏.
首先,你不应该使用
private EnumType prop3;
Run Code Online (Sandbox Code Playgroud)
但
private ActualEnum prop3;
Run Code Online (Sandbox Code Playgroud)
你自己的枚举类型在哪里ActualEnum(例如,Fruits区分苹果和橙子)。
其次,当您使用本机 sql 时,休眠映射是无关紧要的。
现在,我可以提出几个选择。您可以尝试使用 addEntity()而不是一堆标量。Hibernate 可能会正确识别枚举属性并进行映射。
另一种选择是使用非公共设置器,该设置器将从数据库中获取字符串,将其转换为枚举并设置实际属性。
最后,您可以自定义变压器。但这可能是最复杂的选择。
| 归档时间: |
|
| 查看次数: |
9458 次 |
| 最近记录: |