2016-02-23 6 views
5

मैं जावा 8 में एक सरल माइक्रोस्कोस बनाने के लिए स्प्रिंग बूट और डेटा रेस्ट का उपयोग करता हूं और पोस्टग्रेस अपवाद प्राप्त करता हूं।स्प्रिंग डेटा रेस्ट: "डेट शून्य है" क्वेरी पोस्टग्रेस अपवाद फेंकता है

मेरे इकाई:

@Entity 
public class ArchivedInvoice implements Serializable { 
    ... 
    @Column 
    private String invoiceNumber; 
    @Column 
    private java.sql.Date invoiceDate; 
    ... 
} 

मेरे भंडार इंटरफ़ेस:

@RepositoryRestResource(collectionResourceRel = "archivedinvoices", path = "archivedinvoices") 
public interface ArchivedInvoiceRepository extends PagingAndSortingRepository < ArchivedInvoice, Long > { 
    ... 
@RestResource(rel = "findByXYZ", path = "findByXYZ") 
@Query(value = "SELECT ai FROM #{#entityName} ai WHERE " 
     + "(:invoiceNumber IS NULL OR ai.invoiceNumber LIKE :invoiceNumber) AND " 
     + "(:invoiceDate IS NULL OR ai.invoiceDate = :invoiceDate)" 
     ) 
public Page <ArchivedInvoice> findByXYZ(
     @Param("invoiceNumber") @Nullable String invoiceNumber, 
     @Param("invoiceDate") @Nullable Date invoiceDate, 
     Pageable p); 
    ... 
} 

अगर मैं कॉल "? .../findByXYZ invoiceDate = 2016/02/22", मैं निम्नलिखित मिल जाएगा त्रुटि संदेश:

org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet 
... 
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet 
... 
Caused by: org.postgresql.util.PSQLException: FEHLER: could not determine data type of parameter 

लेकिन यह, काम करता है जब मैं निकालें: भाग "invoiceDate शून्य है"। यदि चालानडेट पैरामीटर शून्य है, तो मैं कैसे जांच सकता हूं?

+0

आपको यह एक http://stackoverflow.com/a/27193644/2055854 –

उत्तर

0

जब आप पोस्टग्रेस के साथ जेपीए का उपयोग करते हैं तो एक उत्सुक व्यवहार होता है जो आप जांचना चाहते हैं कि बाद में वांछित स्थिति की जांच करने से पहले पैरामीटर शून्य हो गया है या नहीं।

त्रुटि तब होती है क्योंकि क्वेरी पढ़ने पर, जेपीए पैरामीटर प्रकार की पहचान नहीं कर सकता है, और फिर क्वेरी को समझते समय त्रुटि उत्पन्न कर सकता है।

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

इस प्रकार, जेपीए सही पैरामीटर प्रकार की पहचान करने में सक्षम होगा, और त्रुटि को फिर से नहीं उठाया जाना चाहिए।

निम्न क्वेरी की कोशिश करो और अगर यह काम करेंगे देखें:

@Query(value = "SELECT ai FROM #{#entityName} ai WHERE " 
    + "(:invoiceNumber IS NULL OR ai.invoiceNumber LIKE :invoiceNumber) AND " 
    + "(ai.invoiceDate = :invoiceDate OR :invoiceDate IS NULL)" 
    ) 
+1

दुर्भाग्य से, यह करता है की कोशिश कर सकते काम नहीं। लेकिन यह एक अच्छा विचार था! धन्यवाद! – user2722077

+0

यह क्वेरी में पहले दिनांक पैरामीटर के लिए मेरे लिए काम करता है, न कि प्रेषण दिनांक पैरामीटर के लिए। मेरे पास क्वेरी में दो दिनांक पैरामीटर हैं। यह दूसरी की शिकायत करता है। –

2

मेरा मानना ​​है कि @Bonifacio कि Postgres में सही है जब IS NULL परीक्षण प्रदर्शन कर अपने @Param("invoiceDate") पैरामीटर के प्रकार का निर्धारण करने में सक्षम नहीं है। मेरे पास आपके समान प्रश्न हैं जो मेमोरी एच 2 डेटाबेस में अपेक्षित व्यवहार करते हैं, लेकिन पोस्टग्रेस एकीकरण परीक्षणों में असफल होते हैं।

मैं बहुत की तरह एक तारीख को पैरामीटर कास्टिंग द्वारा इस के आसपास प्राप्त करने में सक्षम था:

@Query(value = "SELECT ai FROM #{#entityName} ai WHERE " 
    + "(:invoiceNumber IS NULL OR ai.invoiceNumber LIKE :invoiceNumber) AND " 
    + "(cast(:invoiceDate as date) IS NULL OR ai.invoiceDate = :invoiceDate)" 
    ) 
+0

रुचि रखने वाले लोगों के लिए, यूयूआईडी के लिए कास्ट प्रकार "बाइनरी" है और "अन्य" या "वर्कर" नहीं है – user1791139

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