将SQLquery映射到普通对象,而不是实体

时间:2015-03-09 14:41:05

标签: java sql-server hibernate mapping

我有以下 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

1 个答案:

答案 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,其属性与选择列匹配