2013-10-02 10 views
6

में Joda दिनांक समय परिवर्तित करने के लिए मैं दिनांक समय गुणों के साथ एक इकाई हाइबरनेटकैसे जेपीए देशी क्वेरी

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") 
@Column(name = "EFF_DT") 
protected DateTime effDt; 

साथ कायम है यह सब अच्छी तरह से और अच्छा नियमित रूप से वसंत-डेटा-जेपीए प्रश्नों उत्पन्न के लिए काम करता है।

मैं एक कस्टम देशी क्वेरी जोड़ने की कोशिश कर रहा हूँ

@Query(value = "SELECT COUNT(*) FROM wsa_circuit_state_history ch WHERE ch.eff_dt between ?1 and ?2", nativeQuery = true) 
    Integer countEffDateBetween(DateTime start, DateTime end); 

त्रुटि मैं मिलता है, जब यह कॉल करने के लिए कोशिश कर रहा

java.sql.SQLException: ORA-00932: inconsistent datatypes: expected DATE got BINARY 

है यह एक ही त्रुटि मैं नियमित रूप से वसंत के साथ पाने के लिए प्रयोग किया जाता है -डाटा खोजकर्ता मेरी इकाई

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") 

मैं वसंत कैसे बना सकता हूं -डेटा-जेपीए/हाइबरनेट मूल प्रश्नों के पैरामीटर के लिए कस्टम प्रकार मैपिंग का उपयोग करते हैं?

+0

विन्यास हाइबरनेट करने के लिए आप इस के लिए एक जवाब मिला की ज़रूरत है? –

+0

@ WojciechGórski नहीं मुझे कोई फिक्स नहीं मिला। अंत में मैं जेपीए में क्वेरी को फिर से लिखने में कामयाब रहा, और फिर हाइबरनेट @ टाइप टाइपोशन ने nz.co.vodafone.wcim से टाइप रूपांतरण '@Query ("चयन गिनती (ch.circuitId) को संभालने के लिए लात मार दी। model.CircuitStateLog ch जहां ch.effDt? 1 और 2 और ch.state =? 3 ")' –

उत्तर

0

बस इस

तरह java.util.Date के लिए अपनी संपत्ति सेट फिर अपने गेटर/सेटर

public DateTime getEffDt() { 
    return null == effDt ? null : new DateTime(effDt); 
} 

public void setEffDt(final DateTime effDt) { 
    this.effDt = null == effDt ? null : effDt.toDate(); 
} 

मूल निवासी में परिवर्तित:

@Query(value = "SELECT COUNT(*) FROM wsa_circuit_state_history ch WHERE ch.eff_dt between ?1 and ?2", nativeQuery = true) 
Integer countEffDateBetween(Date start, Date end); 
+0

डेटटाइम का उपयोग करने से बचने के लिए यह एक दिलचस्प कामकाज है, लेकिन हमारे मामले में हम फ़ील्ड को डेटटाइम के रूप में रखना चाहते थे। –

+0

आप 'countEffDateBetween (डेटटाइम स्टार्ट, डेटटाइम एंड) को क्यों बदल नहीं सकते; '' count'ffDate के बीच (दिनांक प्रारंभ, दिनांक अंत); '? इससे आप अपनी संपत्ति को डेटटाइम के रूप में रखने में सक्षम होंगे। –

+1

हम डेटटाइम का उपयोग कर रहे हैं, java.util.Date नहीं। निश्चित रूप से अगर हमने डेटटाइम और उपयोग की गई तारीख का उपयोग करना बंद कर दिया है, तो हम इस समस्या का अनुभव नहीं करेंगे। हालांकि, हम बहुत बेहतर जोडा डेटटाइम एपीआई का उपयोग करना चाहते हैं। मेरा सवाल यह है कि 'डेटटाइम के साथ मूल प्रश्नों को मैं कैसे काम कर सकता हूं', डेटटाइम का उपयोग नहीं करने से यह सवाल हल नहीं होता है। –

0

एक ऐसी ही स्थिति में मैंने कस्टम कंपोजिट यूज़र टाइप लिखने का सहारा लिया जो जोडा डेटटाइम को दो क्षेत्रों में संग्रहीत करता था, एक डेटी मुझे मैदान और एक समय क्षेत्र क्षेत्र।

जब इकाई बचा लिया गया था यह UTC में समय मूल्य और मूल मूल्य के रूप में समय क्षेत्र संग्रहीत, पुनः प्राप्ति पर यह रिवर्स किया था (यानी यह वापस मूल समय क्षेत्र में डेटाबेस पर संग्रहीत समय परिवर्तित)।

जैसा कि आपने ऊपर पहचाना है, हालांकि "डेटटाइम बीटवेन 1 और 2" जैसी कोई क्वेरी सहज ज्ञान देती है, बेशक यह समग्र प्रकार के संदर्भ में कोई समझ नहीं आता है क्योंकि आपको टाइमज़ोन को ध्यान में रखना होगा। यही वजह है कि मैंने यूटीसी में सभी मूल्यों को संग्रहीत किया था, इसलिए मैं हमेशा डेटाबेस पर किसी भी दो दिनांक/समय मानों की तुलना कर सकता था।

दुर्भाग्य से, इसका मतलब था कि मेरे द्वारा पारित सभी दिनांक/समय क्वेरी पैरामीटर को यूटीसी में परिवर्तित किया जाना था।

0

बिल्कुल मुझे भी एक ही आवश्यकता मिल गई। और मैंने इसे कस्टम प्रकार को हाइबरनेट कॉन्फ़िगरेशन में पंजीकृत करके हल किया।

मूल प्रश्नों के लिए, उपयोगकर्ता प्रकार खोजने के लिए हाइबरनेट के लिए TypeDefs पर्याप्त नहीं हैं। इसके प्रकारों को खोजने के लिए टाइप रिज़ॉल्यूशन की आवश्यकता है।

@Query(value = "SELECT COUNT(*) FROM wsa_circuit_state_history ch WHERE ch.eff_dt between ?1 and ?2", nativeQuery = true) 
    Integer countEffDateBetween(DateTime start, DateTime end); 

इस मामले में, हाइबरनेट प्रकार रिसोल्वर से प्रकार (org.joda.time.DateTime) लगता है की कोशिश करता है।

Type type = session.getFactory().getTypeResolver().heuristicType(typename); 

DateTime.Then यह डिफ़ॉल्ट प्रकार (serializable प्रकार) .और दिनांक समय का मूल्य हो रही है उसके प्रकार के लिए casted है के लिए कोई समाधानकर्ता नहीं है, कि धारावाहिक और डीबी, जहां यह कारण विफल हो रहा है में बने बड़े बाइनरी मूल्य के लिए।

इसके समाधान के लिए, आप दिनांक समय प्रकार रजिस्टर करने के लिए के रूप में

configuration.registerTypeOverride(new org.jadira.usertype.dateandtime.joda.PersistentDateTime(), new String[]{"org.joda.time.DateTime"}); 
संबंधित मुद्दे