इकाई में Enum का उपयोग करते समय एक प्रश्न बनाने के साथ समस्या


86

मेरे पास एक प्रश्न इकाई में निम्नलिखित हैं:

@NamedQuery(name = "Question.allApproved",
    query = "SELECT q FROM Question q WHERE q.status = 'APPROVED'")

तथा

@Enumerated(EnumType.STRING)
private Status status;

// usual accessors

मुझे यह अपवाद मिल रहा है:

अपवाद विवरण: क्वेरी को संकलित करने में त्रुटि [Question.countApproved: SELECT COUNT(q) FROM Question q WHERE q.status = 'APPROVED'], पंक्ति 1, कॉलम 47: अमान्य एनम समान अभिव्यक्ति, प्रकार [myCompnay.application.Status]के गैर एनम मान के साथ एनम मान की तुलना नहीं कर सकते [java.lang.String]। org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy (EntityManagerSetupImpl.java 20101)

मैं यह कैसे तय करुं?


क्या आप एक कस्टम एनम का उपयोग कर रहे हैं? क्या आप स्टेटस एनम दिखाने के लिए दस्तावेज़ को अपडेट कर सकते हैं?
गोंजालो गार्सिया लासुर्तेगुई

जवाबों:


159

मुझे लगता है कि आपको Statusशाब्दिक मूल्य के बजाय अपने (पूरी तरह से योग्य) एनम का उपयोग करना चाहिए , इसलिए कुछ इस तरह से: ( पैकेज Statusमें अपनी एनम मानकर com.myexample)

@NamedQuery(name = "Question.allApproved", 
            query = "SELECT q 
                     FROM Question q 
                     WHERE q.status = com.myexample.Status.APPROVED").

एक JPA2 नियमित रूप से @Query के बारे में क्या? यह शिकायत करता है: एनोटेशन विशेषता Query.value के लिए मान एक स्थिर अभिव्यक्ति होना चाहिए।
स्टीफन

2
आप किस @Queryएनोटेशन की बात कर रहे हैं?
पिओटर नाउकी

2
यह fully qualifiedअधिक महत्वपूर्ण है क्योंकि मुझे लगा कि यह हो सकता है।
अलेक्जेंडर

9
एक विचार पर: यह तब काम नहीं करता था जब एनम इकाई का एक आंतरिक वर्ग था। यदि यह आपके लिए काम नहीं करता है, तो सुनिश्चित करें कि एनम यह अपनी फ़ाइल है!
6

@ इनमोंडोंगेन कोई समाधान है यदि एनम आंतरिक वर्ग है?
राजा आार

-5

प्रारंभिक पोस्ट के 4 साल बाद, कुछ घटनाक्रम हैं। स्प्रिंग 4 और हाइबरनेट 4 का उपयोग करना अब स्पेल अभिव्यक्ति का उपयोग करके हाइबरनेट को 'ट्रिक' करना संभव है। उदाहरण के लिए:

एनम:

package com.mycompany.enums

public enum Status {
    INITIAL, PENDING, REJECTED, APPROVED, SHIPPED, DELIVERED, COMPLETE;
}

यहाँ 'फ़िल्टर' नामक एक रैपर क्लास है, जिसे हम रिपॉजिटरी फ़िल्टरिंग विधि से पास करेंगे।

package com.mycompany.enums

public class Filter implements Serializable {

    /** The id of the filtered item */
    private Integer id;
    /** The status of the filtered item */
    private Status status;
    // more filter criteria here...

    // getters, setters, equals(), hashCode() - omitted for brevity

    /**
     * Returns the name of the status constant or null if the status is null. This is used in the repositories to filter
     * queries by the status using a the SPEL (T) expression, taking advantage of the status qualified name. For example:
     * {@code :#{T(com.mycompany.enums.Status).#filter.statusName}}
     *
     * @return the status constant name or null if the status is null
     */
    public String getStatusName() {
        return null == status ? status : status.name();
    }

 }

अंत में, रिपॉजिटरी में, हम अब फ़िल्टर वर्ग का उपयोग एकल पैरामीटर के रूप में कर सकते हैं और क्वेरी का अनुवाद कर सकते हैं जो एक वस्तु के लिए शाब्दिक और स्पेल अभिव्यक्तियों का मिश्रण प्रतीत होता है:

भंडार:

package com.mycompany.repository

@Repository
public interface OrderRepository extends CrudRepository<Order, Integer> {

    @Query("SELECT o from Order o "
            + "WHERE o.id = COALESCE(:#{#filter.id},o.id) "
            + "AND o.status = COALESCE(:#{T(com.mycompany.enums.Status).#filter.statusName},o.status)")
    public List<Order> getFilteredOrders(@Param(value = "filter") Filter filter);
}

यह पूरी तरह से काम करता है, लेकिन कुछ अजीब कारणों से मुझे अभी तक पता नहीं चला है, यदि आप हाइबरनेट में SQL डिबगिंग को सक्षम करते हैं और बाइंडर लॉगिंग को चालू करते हैं, तो आप हाइबरनेट को इस अभिव्यक्ति को क्वेरी चर में नहीं देख पाएंगे।


आप इसे चर बाइंडिंग के बीच नहीं देखते हैं क्योंकि स्थिरांक को पहले ही क्वेरी स्ट्रिंग में प्रतिस्थापित कर दिया गया है।
अबूनासर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.