我写了一个hsql:
String queryString = "select t1.a, t1.b, t2.c from table1 t1, table2 t2 where t1.id = t2.id";
然后我有一个班级:
class test{
String a;
String b;
String c
....//other getter and setter
}
我试过了: List = getHibernateTemplate()。find(queryString); 这不起作用,当我在jsp页面中使用测试对象时,它会抛出异常。
我必须手动创建一个测试对象:
List<Object[]> list = getHibernateTemplate().find(queryString);
test.seta(list.get(0)[0]);
hibernate可以在hsql中自动为我映射类吗?
答案 0 :(得分:1)
问题是您没有编写HQL查询。您只需编写一个普通的SQL查询。在HQL中,因为hibernate使得从表到类的映射,所以无法进行投影。所以,如果你写了像
这样的东西 String query = "FROM Class1 WHERE ome_condition;
没有SELECT子句,Hibernate将能够在适当的对象中转换结果。
您可以在此处查看有关此内容的更多信息:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html
如果您没有映射,可以为此创建辅助类。说ResultClass。然后将@NamedNativeQuery和@SqlResultSetMapping注释添加到类中:
@NamedNativeQuery(name="queryHehehe", query="select t1.field1 f1, t2.field2 f2 from table1 t1, table2 t2", resultSetMapping="mappingHehehe")
@SqlResultSetMapping(name="mappingHehehe", entities={
@EntityResult(entityClass=my.clazz.AuxiliaryClass.class, fields = {
@FieldResult(name="id", column="f1"),
@FieldResult(name="other_property", column="f2")
}),
})
public class AuxiliaryClass {
public Long id;
public String other_property;
}
我从未使用过这个,但可以工作。祝你好运。
答案 1 :(得分:1)
如果你有table1和table2的映射(参见上面的Prashant问题),你可以这样做:
String queryString = "select t1 from table1 t1
inner join t1.table2 t2";
运行查询后,您应该有一个t1对象列表。
for(Table1 t1:listOfTable1Objects) {
t1.getA(); //for example or whatever you want to do with your object.
}
答案 2 :(得分:0)
如果您需要查询以从多个表返回值并创建未映射类的对象,那么您需要执行您在此处执行的操作,或使用ResultTransformer。
为了使用HibernateTemplate执行此操作,您需要更改使用模板的方式,可能使用execute(HibernateCallback action)
,因为您需要将sql查询转换为Criteria,如{{ 3}}
如果你想尝试这个,你可能想要使用AliasToBeanResultTransformer
或AliasToBeanConstructorResultTransformer
,而不是自己编写变压器。