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

mapping SQLquery to plain Object, not Entity

我有以下 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();
}

Class 来源:

@Entity
@Table(name="SourceTable")
public class Source implements Serializable 
{
  @Id
  private int column1;
  private int column2;
  + getters and setters
}

适当class测试:

@Entity  // why?
public class Test implements Serializable 
{
  @Id
  private int column1;
  private int column2;
  private String column3;
  + getters and setters
}

休眠映射

...
<mapping class="objects.Test"/> // why?
<mapping class="tables.Source"/>
...

一切正常,但我不明白一件事:

为什么对象 Test 必须映射到 hibernate.xml 并由 @Entity 标记签名,如果它在真正的 SQL 服务器中没有反射?为什么它不能是 'plain' Java 对象?

当我删除 @Entity<mapping class="objects.Test"/> 时,它报告以下错误:

org.hibernate.MappingException: Unknown entity: objects.Test

它不一定是,但由于 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 class 应该是一个普通的 POJO,其属性与 select 列相匹配