2009-12-15 9 views
12

मैं डेटाबेस (शायद Postgres, या किसी अन्य डेटाबेस) में कुछ समारोह को परिभाषित करना हो तो:आप हाइबरनेट के साथ कस्टम डेटाबेस फ़ंक्शंस को कैसे कॉल कर सकते हैं?

select * from cookietable c where isValidCookie(c.cookie); 

मैं एक कस्टम कैसे फोन कर सकते हैं:

create or replace function isValidCookie(ckie); 

मैं के रूप में एसक्यूएल से यह कहेंगे इस तरह के काम Hibernate से?

+0

मुझे पता है कि आप एक टेबल के समान दृश्य का उपयोग कर सकते हैं (केवल एक्सएमएल में म्यूटेबल का उपयोग करें), लेकिन एक फ़ंक्शन कॉल करने के लिए बहुत आसान होगा – Zoidberg

उत्तर

13

आप HQL में अपने कस्टम समारोह का उपयोग करना चाहते हैं, तो आप PostgreSQLDialect पर एक नज़र (या किसी अन्य, वास्तव में) स्रोत लो उचित Dialect

में इसे परिभाषित करने की आवश्यकता होगी, और आप एक गुच्छा देखेंगे registerFunction() कॉल का। आपको अपने स्वयं के कस्टम फ़ंक्शन के लिए एक और जोड़ना होगा :-) -।

आपको फिर अपनी हाइबरनेट कॉन्फ़िगरेशन में अपनी बोली निर्दिष्ट करनी होगी।

3

आप मूल प्रश्नों का उपयोग कर ऐसा करने में सक्षम हो सकते हैं। यह doc बताता है।

3

हाइबरनेट 5 के रूप में, यदि आप बोली पर निर्भर या अनुकूलित नहीं करना चाहते हैं, तो आप MetadataBuilderInitializer को परिभाषित कर सकते हैं। उदाहरण के लिए, HQL से एक INTERVAL साथ MySQL DATE_ADD उपयोग करने के लिए, आप date_add_interval नामक कस्टम समारोह को परिभाषित कर सकते हैं:

public class DateAddIntervalMetadataBuilderInitializer 
     implements MetadataBuilderInitializer { 
    @Override 
    public void contribute(MetadataBuilder metadataBuilder, 
      StandardServiceRegistry serviceRegistry) { 
     metadataBuilder.applySqlFunction("date_add_interval", 
      new SQLFunctionTemplate(DateType.INSTANCE, 
       "DATE_ADD(?1, INTERVAL ?2 ?3)")); 
    } 
} 

तुम भी एक जार संसाधन META-INF/services/org.hibernate.boot.spi.MetadataBuilderInitializer बुलाया फ़ाइल में क्लास का नाम डाल करने के लिए की आवश्यकता होगी।

यह दृष्टिकोण जेपीए और/या वसंत जैसे ढांचे के माध्यम से हाइबरनेट का उपयोग करते समय विशेष रूप से उपयोगी होता है, जहां कॉन्फ़िगरेशन ढांचे द्वारा पूरी तरह से किया जाता है।

+0

अरे मुझे Mariadb COLUMN_GET और TIMESTAMPDIFF फ़ंक्शंस का समर्थन करने के लिए बिल्कुल इस सुविधा की आवश्यकता है। वर्तमान में हाइबरनेट क्वेरी उपनामों के साथ फ़ंक्शन पैरामीटर को उपसर्ग करने का प्रयास करता है। स्प्रिंग बूट में मुझे इन कक्षाओं को पंजीकृत करने के लिए कहां जाना है? – Pascal