没有基础表的Hibernate实体

我有一个非常难看的遗留数据库系统,我需要与之集成。 基本上我在系统上做一些只读报告,我不想设置代表我正在处理的每个表的一千个实体。 相反,我想为我生成的每个报告类型定义一个实体(实质上是来自不同表的一堆列的联合),然后让hibernate映射来讨厌(很多联合,很多联合) sql查询到这样的实体列表。

问题是:我可以创建一个没有基础表的实体,并使用sql语句填充所述实体的列表吗?

谢谢!

我们一直这样做 – 这就是我们如何做到的:

  1. 定义一个简单的类bean对象来表示报表中的每一行输出:

    public class CityStateRevenueReport { private String mId; private String mState; private String mCity; private Double mRevenue; public String getId() { return mId; } public void setId(String i) { mId = i; } public String getState() { return mState; } public void setState(String s) { mState = s; } public String getCity() { return mCity; } public void setCity(String c) { mCity = c; } public Double getReveneue() { return mRevenue; } public void setRevneue(Double d) { mRevenue = d; } } 
  2. 定义一个hibernate映射文件,CityStateRevneueReport.hbm.xml:

                     
  3. 然后运行查询并填充实例:

     public List runReport() { List reports = new ArrayList(); List maps = session.getNamedQuery("runReport").list() for ( HashMap map : results ) { CityStateRevenueReport report = new CityStateRevenueReport(); report.setState(map.get("state")); report.setCity(map.get("city")); report.setRevenue(Double.parseDouble(map.get("revenue")); reports.add(report); } return reports; } 

使用实体查询:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querysql.html#d0e13696

 sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class); 

或者在数据库中创建一个视图并映射它。

这是一个使用addEntity的更长的教程:

http://timezra.blogspot.com/2009/05/mapping-hibernate-entities-to-views.html

 private Collection findByFirstName() { return sessionFactory.getCurrentSession() // .createSQLQuery(AUTHORS_BY_FIRST_NAME) // .addEntity(AuthorAggregate.class) // .list(); } 

如果你可以自由选择hibernate,我建议你看一下Spring JDBC 。 它比hibernate更轻,工作正常。 根据您的要求,它将很好地适应图片。