簡體   English   中英

沒有基礎表的Hibernate實體

[英]Hibernate entities without underlying tables

我有一個非常難看的遺留數據庫系統,我需要與之集成。 基本上我在系統上做一些只讀報告,我不想設置代表我正在處理的每個表的一千個實體。 相反,我想為我生成的每個報告類型定義一個實體(實質上是來自不同表的一堆列的聯合),然后讓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:

     <?xml version="1.0" ?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd&quot;> <hibernate-mapping> <class entity-name="CityStateRevenueReport"> <id name="Id" type="java.lang.String" column="report_id"> <generator class="sequence" /> </id> <property name="city" type="string" column="city" /> <property name="state" type="string" column="state" /> <property name="revenue" type="double" column="revenue" /> </class> <sql-query name="runReport"> <![CDATA[ SELECT {r.*} FROM (select some_id_value as report_id, state_abbreviation as state, city_name as city, dollar_amount as revenue from -- tables, joins, other SQL insanity ) r ]]> <return alias="r" class="CityStateRevenueReport" /> </sql-query> </hibernate-mapping> 
  3. 然后運行查詢並填充實例:

     public List<CityStateRevenueReport> runReport() { List<CityStateRevenueReport> reports = new ArrayList<CityStateRevenueReport>(); List<HashMap> 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<AuthorAggregate> findByFirstName() {
    return sessionFactory.getCurrentSession() //
            .createSQLQuery(AUTHORS_BY_FIRST_NAME) // 
            .addEntity(AuthorAggregate.class) //
            .list();
}

如果你可以自由選擇hibernate,我建議你看一下Spring JDBC 它比休眠更輕,工作正常。 根據您的要求,它將很好地適應圖片。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM