我有以下 Java方法:
public void loadData()
{
session = DaoSF.getSessionFactory().openSession();
String sql = "select s.column1, SUM(s.column2), 'hi' as column3 from Source s group by s.column1";
Query query = session.createSQLQuery(sql).addEntity(Test.class);
dataList = query.list();
}
班级来源:
@Entity
@Table(name="SourceTable")
public class Source implements Serializable
{
@Id
private int column1;
private int column2;
+ getters and setters
}
适当的类测试:
@Entity // why?
public class Test implements Serializable
{
@Id
private int column1;
private int column2;
private String column3;
+ getters and setters
}
hibernate映射:
...
<mapping class="objects.Test"/> // why?
<mapping class="tables.Source"/>
...
一切正常,但我不明白一件事:
为什么对象Test
必须在hibernate.xml
中映射并由@Entity
标记签名,如果它在真正的SQL服务器中没有反射?为什么它不能成为一个“普通的”Java对象?
当我删除@Entity
和<mapping class="objects.Test"/>
时,它会报告以下错误:
org.hibernate.MappingException: Unknown entity: objects.Test
答案 0 :(得分:2)
它不一定是,但你已经明确地将它标记为实体,因为hibernate正在调用entity query
Query query = session.createSQLQuery(sql).addEntity(Test.class);
你应该做的是return a non-managed entity in a query所以写一些像
这样的东西Query query = session.createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(Test.class));
在后一种情况下, Test 类应该是一个普通的POJO,其属性与选择列匹配