2012-12-12 11 views
5

मेरे पास एक टाइमस्टैम्प रखने के लिए नियत एक कॉलम है जिसे java.util.Date डेटा प्रकार के साथ परिभाषित किया गया है और डेटाबेस में ओरेकल DATE प्रकार में संग्रहीत किया गया है। मैंने सत्यापित किया है कि पूर्ण दिनांक और समय की जानकारी डेटाबेस से ठीक से पुनर्प्राप्त और पुनर्प्राप्त की जाती है, लेकिन जब मैं इसे NamedQuery में तुलना करने का प्रयास करता हूं, तो समय की जानकारी तुलना में ध्यान में नहीं लेती है।जेपीए: टाइमेडैम्प तुलना NamedQuery में: समय डेटा खो गया

स्तंभ के रूप में निम्नानुसार परिभाषित किया गया है (analyzeDate प्रकार java.util.Date की है):

@Basic(optional = false) 
@Column(name = "ANALYZE_DATE") 
@Temporal(TemporalType.TIMESTAMP) 
private Date analyzeDate; 

और मेरे NamedQuery:

@NamedQuery(name = "BOADocument.findByBeforeAnalyzeDate", 
    query = "SELECT b FROM BOADocument b WHERE b.companyId = :companyId AND b.analyzeDate < :analyzeDate") 

कौन सा मैं तो अमल, गुजर analyzeDate की है जो टाइप करें java.util.Date:

List<BOADocument> docs = em.createNamedQuery("BOADocument.findByBeforeAnalyzeDate") 
      .setParameter("companyId", clientRecord) 
      .setParameter("analyzeDate", analyzeDate, TemporalType.TIMESTAMP) 
      .getResultList() 

मुझे दस्तावेज़ तालिका में सभी पंक्तियों की एक सूची वापस मिलती है , हालांकि उनके पास विश्लेषण के लिए बिल्कुल वही मान है, जिसे मैंने NamedQuery के पैरामीटर के रूप में सेट किया है।

यदि मैं तुलना में उलटा हूं, तो मुझे कोई लाइन नहीं मिलती है, और मुझे विश्वास दिलाता है कि टाइमस्टैम्प का समय हिस्सा b.analyzeDate पक्ष पर खो रहा है, न कि: चीजों का विश्लेषण करें।

मैं जेबए 1.0 का उपयोग हाइबरनेट 3.5 के साथ कर रहा हूं।

यह मुझे रोक रहा है, और मैं एक मूल प्रश्न छोड़ने और उपयोग करने के करीब हूं, लेकिन यह धोखाधड़ी की तरह लगता है!

+0

मिलीसेकंड का मामला हो सकता है, पैरामीटर में और डेटाबेस मानों में अपना मान जांचें। – remigio

+0

चूंकि ओरेकल डेटाबेस में कॉलम प्रकार DATE है, वहां कोई भी मिलीसेकंद जानकारी संग्रहीत नहीं है। मिलीसेकंद जानकारी java.util.Date पक्ष में मौजूद है, इसलिए मैंने चेक किया (दिनांक .getTime() दोनों की तुलना करना) और जिस मान में मैं पास करता हूं और मेरे गुणों से प्राप्त मूल्य समान हैं। अभी भी स्टंप ... – emilys

उत्तर

3

ऐसा लगता है कि अंतर्निहित ओरेकल प्रकार TIMESTAMP होना चाहिए।

DATE के घंटे, मिनट और दूसरा जानकारी रखती है। यह मेरी प्रयोजनों के लिए पर्याप्त सटीक है, इसलिए मैं यह TIMESTAMP है, जो भी मिलीसेकेंड धारण के बजाय का उपयोग करने पर योजना बना रहा था। मैंने कहा जैसा कि पहले, भंडारण और घंटे, मिनट, और दूसरी जानकारी की पुनर्प्राप्ति और DATE से पूरी तरह से काम कर रहा था, लेकिन नामित प्रश्नों के समय डेटा के आधार पर तुलना नहीं।

मैंने डेटाबेस कॉलम प्रकार और वॉयला, कोड को पहले लिखित कार्यों के रूप में बदल दिया। मुझे मिलीसेकंड भी बचाया जाता है, लेकिन यह मेरे कोड में कोई साइड इफेक्ट नहीं पेश करता है।

1

से BOADocument बी एक

चयन ख निम्नलिखित के रूप में क्वेरी को संशोधित कहां b.companyId =: companyId और कलाकारों (b.analyzeDate के रूप में TIMESTAMP) <:। AnalyzeDate "

+0

यह समझ में आता है, लेकिन हां, यह कुछ भी नहीं बदला। मैंने नोटिस किया कि यह मामला के बारे में पसंद है: टाइमस्टैम्प को लोअरकेस में होना चाहिए। मुझे देखने के लिए अनुमति दी गई कि कैसे सीएएसटी को नियोजित किया जाए, हालांकि! – emilys

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