2011-11-03 14 views
10

मेरे पास वास्तव में बदसूरत विरासत डेटाबेस सिस्टम है जिसे मुझे एकीकृत करने की आवश्यकता है। अनिवार्य रूप से मैं कुछ सिस्टम केवल रिपोर्टिंग पर पढ़ रहा हूं, और मैं उन सभी टेबलों का प्रतिनिधित्व करने वाली हजारों इकाइयों को स्थापित नहीं करना चाहता हूं जिन पर मैं काम कर रहा हूं। इसके बजाय, मैं केवल उत्पन्न होने वाली प्रत्येक रिपोर्ट-प्रकार के लिए एक इकाई को परिभाषित करना चाहता हूं (अनिवार्य रूप से विभिन्न तालिकाओं से कॉलम के समूह का एक संघ), और फिर गंदे से मानचित्र को हाइबरनेट करने दें (कई शामिल हुए, कई संघीय) ऐसी संस्थाओं की एक सूची के लिए एसक्यूएल क्वेरी।अंतर्निहित तालिकाओं के बिना हाइबरनेट इकाइयां

सवाल यह है: क्या मैं ऐसी संस्था बना सकता हूं जिसमें अंतर्निहित तालिका नहीं है, और कहा गया इकाइयों की सूची तैयार करने के लिए एक एसक्यूएल कथन का उपयोग करें?

धन्यवाद!

उत्तर

8

हम बात की इस प्रकार की कर हर समय - और यहाँ है कि हम इसे कैसे करते हैं:

  1. एक साधारण सेम जैसी वस्तु को परिभाषित अपनी रिपोर्ट में उत्पादन की प्रत्येक पंक्ति का प्रतिनिधित्व करने के:

    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. एक हाइबरनेट मैपिंग फ़ाइल को परिभाषित करें, 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; 
    } 
    
+0

मैं इस जवाब में बदल गया क्योंकि यह हाइबरनेट का उपयोग करता है और मूल प्रश्न को बेहतर उत्तर देता है। – idbentley

+0

हाइबरनेट मैपिंग क्लास में, आपको "इकाई-नाम" के बजाय "नाम" का उपयोग करना चाहिए और हाइबरनेट स्वचालित रूप से उन्हें बनाने के लिए बॉयलरप्लेट कोड के बिना परिणाम ऑब्जेक्ट्स को स्वयं बनाने में सक्षम होगा। यह अच्छा होगा अगर यह केवल एनोटेशन के साथ किया जा सकता है, लेकिन मुझे कोई रास्ता नहीं मिला। –

3

एक इकाई क्वेरी का उपयोग करें:

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(); 
} 
2

आप हाइबरनेट या नहीं चुनने के लिए स्वतंत्र हैं, तो मैं तुम्हें Spring JDBC पर एक नज़र डालें सुझाव देते हैं। यह हाइबरनेट से हल्का है और सही काम करता है। आपकी आवश्यकताओं के साथ यह तस्वीर में अच्छी तरह से अनुकूल होगा।

+0

बहुत बहुत शुक्रिया - यह मेरी जरूरतों के लिए एक बेहतर समाधान की तरह लगता है। – idbentley

संबंधित मुद्दे