2010-02-26 13 views
11

मेरे पास ओरेकल डीबी में दिनांक प्रकार कॉलम है और इसमें निश्चित रूप से दिनांक और समय शामिल है। लेकिन जब मैं जावा एप्लिकेशन में डेटा प्राप्त करने की कोशिश कर रहा हूं तो यह वास्तविक समय की बजाय शून्य के गुच्छा के साथ तारीख लौटाएगा। कोड में यह हो जाएगा की तरह:जावा डेट हाइबरनेट कट ऑफ टाइम

SQLQuery sqlQuery = session.createSQLQuery("SELECT table.id, table.date FROM table"); 
List<Object[]> resultArray = sqlQuery.list(); 
Date date = (Date)resultArray[1]; 

यदि ऐसा है तो 26-Feb-2010 17:59:16 डीबी में मैं मिल जाएगा 26-Feb-2010 00:00:00 यह कैसे प्राप्त करने के लिए समय के साथ?

उत्तर

4

मैं ओरेकल के साथ एक विशेषज्ञ नहीं हूं, लेकिन आपको टाइम स्टैम्प प्राप्त करने के लिए शायद DateTime कॉलम प्रकार की आवश्यकता है।

इसके साथ आपको java.sql.Timestamp जेडीबीसी प्रकार का उपयोग करने की आवश्यकता है।

+3

ओरेकल में, 'DATE' डेटाप्रकार दोनों की तारीख और समय में जानकारी शामिल है , 'java.lang.Date' की तरह। –

0

इस प्रयास करें:

session.createSQLQuery("SELECT table.id as i, table.date as d FROM table") 
    .addScalar("i", Hibernate.LONG) // Or whatever type id is 
    .addScalar("d", Hibernate.TIMESTAMP); 
+0

धन्यवाद। अब यह काम कर रहा है। लेकिन मुझे इस तथ्य से नफरत है कि मुझे सभी लौटाए गए पैरामीटर के लिए प्रकार परिभाषित करना चाहिए। मेरे पास बहुत सारे हैं ... – Vlad

+0

आप एक कस्टम बोली का प्रयास कर सकते हैं। बेस बोलीभाषा कहती है, "स्केलर स्क्लक्वायरी प्रकार ऑटो डिटेक्शन में डिफ़ॉल्ट उपयोग के लिए हाइबरनेट प्रकार पंजीकृत करें" और इसमें टाइप.डेट हैबर्ननेट से मेल खाता है। डेटा - आप इसे उपclass कर सकते हैं और Type.DATE से Hibernate.TIMESTAMP से मिलान कर सकते हैं। –

0

शायद तुम this problem? है सुनिश्चित करें कि आप नवीनतम JDBC ड्राइवर किया हुआ है, फ़ाइल नाम ojdbc5.jar होना चाहिए।

3

मुझे एक ही समस्या थी (डेटाबेस में ओरेकल दिनांक प्रकार)।

निम्नलिखित मानचित्रण मेरे लिए काम करता है:

<property name="timeStamp" type="java.util.Date"> 
    <column name="TIME_STAMP"/> 
</property> 
2

मैं भी अतीत में इस मुद्दे का सामना करना पड़ा है। यह हल करने के लिए से अपने हाइबरनेट मानचित्रण बदलें:

<property name="timeStamp" type="java.util.Date"> 
    <column name="TIME_STAMP"/> 
</property> 

को

<property name="timeStamp" type="timestamp"> 
    <column name="TIME_STAMP"/> 
</property> 
आप java.util.Date के रूप में अपने हाइबरनेट वस्तु में डेटा प्रकार छोड़ सकते हैं।

2

हाँ यह भी ठीक काम कर रहा हाइबरनेट 3.3, ojdbc6.jar का उपयोग करें और एनोटेशन में तरह

नीचे
@Id 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "TDATE", length = 7) 
public Date getTdate() { 
    return this.tdate; 
} 

public void setTdate(Date tdate) { 
    this.tdate = tdate; 
} 
9

के रूप में दूसरों को पहले से ही कहा है टाइमस्टैम्प के तारीख बदलने के लिए, आप java.sql.Timestamp उपयोग करने के लिए समय पाने के लिए की जरूरत है।

हालांकि, यदि आप ओरेकल के DATE कॉलम पर @Temporal(TemporalType.TIMESTAMP) एनोटेशन का उपयोग करते हैं, तो हाइबरनेट शिकायत और स्कीमा सत्यापन त्रुटियों को फेंक देगा। उन से बचने के लिए एक columnDefinition इस तरह जोड़ें:

@Temporal(TemporalType.TIMESTAMP) 
@Column(name="EVENTTIME", columnDefinition="DATE") 
private Date eventTime; 
+2

मैं इसे पर्याप्त रूप से ऊपर नहीं उठा सकता! यह स्वीकार्य जवाब होना चाहिए! –

0

मैं हाल ही में एक ही समस्या में था। यहां मेरा दृष्टिकोण है ...

तो इस मामले में क्वेरी 0 कार्यान्वयन वर्ग में लूप के लिए परिभाषित करें, जैसे कि यह डेटाबेस तालिका के सभी कॉलम के प्रकार की जांच करता है। यदि कॉलम नाम DATE का प्रकार है तो क्वेरी बिल्डर को addScalar ("columnName", नया Timestamptype()) संलग्न करें। इस तरह दिनांक प्रकार कॉलम जावा एप्लिकेशन में टाइमस्टैम्प प्रदर्शित करेगा।

SQLQuery hibernateQuery = getSession().createSQLQuery(sqlQuery); 

     Set<String> columns = columnDataTypes.keySet(); 
    for (String column : columns) { 
     if (columnDataTypes.get(column).equals(SqlType.DATE.name())) { 
      hibernateQuery.addScalar(column, new TimestampType()); 
     } else { 
      hibernateQuery.addScalar(column); 
     } 
    } 

आशा इस मदद करता है:

नीचे नमूना कोड प्राप्त करें।

राकेश।

0

शायद थोड़ा देर हो चुकी है, लेकिन मेरे मामले में समाधान केवल मेरे समय-क्षेत्र में @ टेम्पोरल (टेम्पोरल टाइप.डेट) जोड़ना था।

@Temporal(TemporalType.DATE) 
private Date date; 

और एक और समाधान हमने पाया (जब पहले एक काम नहीं किया) स्पष्ट रूप से टाइप हाइबरनेट बताने के लिए किया गया था:

@Type(type = "date") 
private Date date; 
संबंधित मुद्दे