2010-05-18 20 views
20
SELECT x FROM SomeClass 
WHERE x.dateAtt BETWEEN CURRENT_DATE AND (CURRENT_DATE + 1 MONTH) 

के लिए कोई समयावधि जोड़ने के लिए ऊपर JPQL बयान में SomeClass एक memebr dateAttr है, जो एक java.util.Date है और एक @Temporal(javax.persistence.TemporalType.DATE) एनोटेशन है है।जावा: JPQL तारीख समारोह एक और तारीख

मुझे (CURRENT_DATE + 1 MONTH) बिट करने का कोई तरीका चाहिए - यह वर्तमान स्थिति में स्पष्ट रूप से गलत है - लेकिन जेपीक्यूएल के लिए डेट फ़ंक्शन के साथ दस्तावेज़ नहीं मिल सकता है।

क्या कोई मुझे उस दस्तावेज़ की दिशा में इंगित कर सकता है जो दस्तावेज़ जेपीक्यूएल दिनांक फ़ंक्शन (और यह विशेष क्वेरी कैसे करें)?

+0

क्या यह कुछ विधि है जो आप चाहते हैं? या क्या यह इकाई पर ट्रिगर में होने की आवश्यकता है? आईई: '@ प्रीपेर्सिस्ट 'या' @ प्रीअपडेट '? –

+0

@ शेरविन: नहीं, क्वेरी को '@ प्रीपेर्सिस्ट' या '@ प्रीअपडेट' में निष्पादित करने की आवश्यकता नहीं है। क्वेरी एक जेपीए इकाई वर्ग ('SomeClass') पर एक नामित क्वेरी है। – bguiz

+0

@ शेरविन: इसके अलावा, मुझे पता है कि मैं 'डेट' मैनिप्लेशंस की गणना करने के लिए जावा का उपयोग कर सकता हूं और फिर इसे 'पैरामीटर' का उपयोग करके क्वेरी में पास कर सकता हूं, हालांकि, मैं इसे जेपीक्यूएल में ही करता हूं और अनावश्यक से बचता हूं कोड। – bguiz

उत्तर

17

आप एक तिथि वस्तु है कि + 1 महीने है, तो पहले से ही आप कुछ इस तरह कर सकता है:

public List findEmployees(Date endDate) { 
    return entityManager.createQuery(
    "SELECT e from Employee e WHERE e.startDate BETWEEN ?1 AND ?2") 
    .setParameter(1,new Date(), TemporalType.DATE) 
    .setParameter(2,endDate, TemporalType.DATE).getResultList(); 
} 

हालांकि यह जरूरी है कि दिनांक पहले से मान्य हो।

अद्यतन

आप हमेशा अगले महीने चाहते हैं, आप JodaTime जो एक महान और आसान एपीआई का उपयोग कर सकते है। फिर आप इस तरह आपकी क्वेरी को संशोधित कर सकते हैं:

//Get next month 
DateTime dt = new DateTime(); 
entityManager.createQuery(
"SELECT e from Employee e WHERE e.startDate BETWEEN ?1 AND ?2") 
.setParameter(1,new Date(), TemporalType.DATE) 
.setParameter(2,dt.plusMonths(1).toDate(), TemporalType.DATE).getResultList(); 
+3

क्या आपने जोडाटाइम भाग को आजमाया था? क्या जेपीए 'डेटटाइम' से निपट सकता है? –

+0

@ पास्कल: अच्छा बिंदु।मैं toDate() विधि भूल गया। यह 'java.util.Date' –

+1

लौटाएगा थोड़ा सुधार: '.setParameter (1, dt.toDate(), TemporalType.DATE)' (अगली पंक्ति के साथ एक आयात कम और स्थिरता) –

4

या का उपयोग कॉमन्स-लैंग jodatime के बजाय:

entityManager.createQuery(
    "SELECT e from Employee e WHERE e.startDate BETWEEN ?1 AND ?2" 
) 
.setParameter(1,new Date(), TemporalType.DATE) 
.setParameter(2,DateUtils.addMonths(new Date(), 1), TemporalType.DATE) 
.getResultList(); 

लेकिन मैं जानता हूँ कि यह तुम क्या नहीं पूछ रहे हैं और मैं बहुत यकीन है कि है यह अकेले जेपीक्यूएल में नहीं किया जा सकता है, आपको या तो पैरामीटर पास करना होगा या मूल नामित क्वेरी

+0

'दिनांक उपयोग'? क्या वह एसडीडी जेडीके का हिस्सा है या क्या यह जोडा समय की तरह पुस्तकालय है? – bguiz

+0

यह अपाचे कॉमन्स/लैंग में है, एक ओपन सोर्स लाइब्रेरी जिसका उपयोग कई ढांचे द्वारा आंतरिक रूप से किया जाता है: http://commons.apache.org/lang/ –

+2

जोडा-टाइम का उपयोग करने के लिए बेहतर है क्योंकि यह जेएसआर -310 (https का संदर्भ कार्यान्वयन है) : //jsr-310.dev.java.net/) –

15

मानक जेपीक्यूएल तारीखों पर इस तरह के संचालन का समर्थन नहीं करेगा। आपको या तो मूल क्वेरी का उपयोग करना होगा या जावा पक्ष पर गणना करना होगा।

+1

क्या यह अभी भी सच है? – span

0

Dears,

मैं वसंत डेटा का उपयोग कर रहा हूँ, इकाई दिनांक के रूप में CreatedDate बचाने के लिए, और इस तरह भंडार में:

@Query(value="SELECT t FROM MyEntity t WHERE t.createdDate Between ?1 and ?2") 
public List<MyEntity> findAllBetweenDates(Calendar from, Calendar to); 

तो मैं का उपयोग नहीं कर सकते हैं:

setParameter(1,new Date(), TemporalType.DATE 

//to set zero of hours,minutes,seconds and milliseconds 
    fromCalendar.set(java.util.Calendar.HOUR, 0); 
    fromCalendar.set(java.util.Calendar.MINUTE, 0); 
    fromCalendar.set(java.util.Calendar.SECOND, 0); 
    fromCalendar.set(java.util.Calendar.MILLISECOND, 0); 

    toCalendar.set(java.util.Calendar.HOUR, 0); 
    toCalendar.set(java.util.Calendar.MINUTE, 0); 
    toCalendar.set(java.util.Calendar.SECOND, 0); 
    toCalendar.set(java.util.Calendar.MILLISECOND, 0); 
    // add 1 days and decrease 1 millisecond 
    toCalendar.add(java.util.Calendar.DAY_OF_MONTH, 1); 
    toCalendar.add(java.util.Calendar.MILLISECOND, -1); 

    allEntities = myEntityRepository.findAllBetweenDates(fromCalendar, toCalendar); 
} 
:

बैकएंड सेम में मैं निम्नलिखित का उपयोग 0

और यह ठीक काम कर रहा है।

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