2010-05-11 8 views
5

मेरे पास इस तरह की एक सारणी है:केवल एचक्यूएल उपयोग के लिए संपत्ति को कैसे मैप करें (हाइबरनेट में)?

id | name | score 

एचबीआरनेट के साथ एक्सएमएल के माध्यम से पीओजेओ में मैप किया गया। स्कोर कॉलम मुझे केवल oder by में चाहिए - एचक्यूएल में खंड। स्कोर कॉलम के लिए मान को एल्गोरिदम द्वारा गणना की जाती है और एसक्यूएल बैच प्रक्रिया (जेडीबीसी) के माध्यम से हर 24 घंटों में अपडेट किया जाता है। इसलिए मैं अपने POJO को उन गुणों के साथ प्रदूषित नहीं करना चाहता हूं जिन्हें मुझे रनटाइम पर आवश्यकता नहीं है।

एक कॉलम के लिए जो कोई समस्या नहीं हो सकती है, लेकिन मेरे पास कई अलग-अलग स्कोर कॉलम हैं। क्या एचक्यूएल उपयोग के लिए केवल संपत्ति को मैप करने का कोई तरीका है?

उदाहरण के लिए:

<property name="score" type="double" ignore="true"/> 

ताकि मैं अभी भी ऐसा कर सकूं:

from Pojo p order by p.score 

लेकिन मेरा POJO कार्यान्वयन इस तरह दिख सकता है:

public class Pojo 
{ 
    private long id; 

    private String name; 

    // ... 
} 

कोई सेटर नहीं score प्रदान किया गया या कार्यान्वयन में संपत्ति जोड़ा गया। जावा के लिए नवीनतम हाइबरनेट संस्करण का उपयोग कर

अद्यतन:

एक परिपूर्ण दुनिया में इसे इस तरह किया जा सकता है (Pascal Thivent के लिए धन्यवाद):

<property name="score" access="noop" insert="false" update="false"/> 

लेकिन हमारी वास्तविक दुनिया में a bug since years मौजूद है जो कोई भी देखभाल नहीं करता के बारे में। तो क्या किसी के पास कामकाज के लिए कोई सुझाव है?

+0

इस नोप चीज़ के बारे में, सावधान रहें! यह मैप किए गए जावा ऑब्जेक्ट का हिस्सा नहीं होगा, लेकिन यह अभी भी एचक्यूएल मेमोरी में मौजूद होगा! मैं एक बार परिणाम के हिस्से के रूप में एक बीएलओबी क्षेत्र नहीं प्राप्त करना चाहता था क्योंकि वे जावा मेमोरी भर रहे थे लेकिन इसे क्वेरी में विचार किया जाना था। मैंने सोचा कि मैं सुरक्षित था लेकिन आउटऑफ मेमरी त्रुटियों को समाप्त कर दिया क्योंकि एचक्यूएल क्वेरी अभी भी सभी बीएलओबी लोड कर रही थी, भले ही वे परिणाम का हिस्सा न हों। – Icegras

उत्तर

3

आप क्वेरी-केवल गुण निर्दिष्ट करने के लिए अपने मानचित्रण में access="noop" उपयोग कर सकते हैं (जो एक गुप्त, गैर फीचर दस्तावेज है, HHH-552 देखें):

<property name="score" access="noop" insert="false" update="false" ... /> 

अद्यतन: बस के साथ स्पष्ट करने के लिए, निम्नलिखित निकाय:

public class EntityWithHqlOnlyProperty implements Serializable { 
    private Long id; 
    private String name; 

    //... 
} 

और यह मानचित्रण:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="com.stackoverflow.q2812672.EntityWithHqlOnlyProperty" table="EntityWithHqlOnlyProperty"> 
     <id name="id" type="java.lang.Long"> 
      <column name="id" /> 
      <generator class="assigned" /> 
     </id> 
     <property name="name" type="string"> 
      <column name="name" not-null="true" /> 
     </property> 
     <property name="score" type="double" access="noop" insert="false" update="false"/> 
    </class> 
</hibernate-mapping> 

निम्नलिखित स्निपेट:

Query q = session.createQuery("from EntityWithHqlOnlyProperty e order by e.score"); 
List<EntityWithHqlOnlyProperty> resultList = q.list(); 
assertNotNull(resultList); 

निम्नलिखित एसक्यूएल उत्पन्न करता है:

select 
    entitywith0_.id as id6_, 
    entitywith0_.name as name6_, 
    entitywith0_.score as score6_ 
from 
    EntityWithHqlOnlyProperty entitywith0_ 
order by 
    entitywith0_.score 

और मेरी असली दुनिया में, परीक्षण बस गुजरता है। यह डर्बी और एचएसक्यूएलडीबी पर हाइबरनेट कोर 3.3.2.GA के साथ परीक्षण किया गया है। दूसरे शब्दों में, यह मेरी मशीन (सी) पर काम करता है।

यदि यह आप के लिए नहीं है - और मैं अशिष्ट होना मतलब नहीं है, लेकिन - एक आदर्श दुनिया में आप एक टेस्ट केस HHH-2925 पुन: पेश करने के रूप में 3 + साल के लिए अनुरोध किया की इजाजत दी प्रदान करना चाहिए। किसी समस्या को पुन: उत्पन्न करने का एक तरीका प्रदान करना (मैं नहीं कर सकता) इसे ठीक करने की संभावनाओं को अत्यधिक बढ़ा देता है।

+0

क्या आप वाकई इस सुविधा को त्याग नहीं चुके हैं? मुझे एक 'org.hibernate.PropertyNotFoundException' – ManBugra

+0

@ManBugra 100% सुनिश्चित करें कि यह अभी भी है (मैंने हाइबरनेट 3.2.5.ga, 3.3.2.GA, 3.5.1-फ़ाइनल की जांच की है) और हटाया नहीं जाएगा। –

+0

आपके सुझाए गए मैपिंग के साथ मुझे एक PropertyNotFoundException मिलता है। क्या मुझे इस एक्सेसर को किसी भी तरह कॉन्फ़िगर करने की आवश्यकता है? क्या कोई अन्य विन्यास आवश्यक है? – ManBugra

-1

यह org.hibernate.PropertyNotFoundException दे रहा है क्योंकि आप एक्सएमएल मैपिंग में संपत्ति के प्रकार विशेषता निर्दिष्ट करना भूल गए हैं। कृपया कोशिश करें।

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