यह इतना आसान नहीं है क्योंकि हाइबरनेट/जेपीए यह गारंटी देने का प्रयास करता है कि इकाई मॉडल डेटाबेस स्थिति के साथ समन्वयित है। आप स्पष्ट रूप से एक प्रक्षेपण चाहते हैं जिसे संभवतः डेटाबेस के साथ सिंक में नहीं रखा जाना चाहिए। यदि आपको वास्तव में ऐसा करना है, तो आप निम्न क्वेरी का उपयोग कर सकते हैं, लेकिन सावधान रहें कि इससे संग्रह में सेवा तत्वों को हटाया जा सकता है जो मानदंड से मेल नहीं खाते:
@Query(value = "SELECT DISTINCT req FROM request req JOIN FETCH req.services srvs WHERE (srvs.status = :serviceStatus)")
List<Request> getAll(@Param("serviceStatus") String serviceStatus);
यह आमतौर पर डीटीओ को शुरू करके नियंत्रित किया जाता है और मुझे लगता है कि यह के लिए एकदम सही उपयोग का मामला है। ब्लेज़-पर्सिस्टेंस एंटिटी व्यूज़ ।
मैंने जेपीए मॉडल और कस्टम इंटरफ़ेस या अमूर्त वर्ग परिभाषित मॉडल के बीच आसान मैपिंग की अनुमति देने के लिए लाइब्रेरी बनाई, स्टेरॉयड पर स्प्रिंग डेटा प्रोजेक्शन जैसे कुछ। विचार यह है कि आप अपनी लक्ष्य संरचना (डोमेन मॉडल) को अपनी पसंद के अनुसार परिभाषित करते हैं और JPQL अभिव्यक्तियों के माध्यम से इकाई मॉडल के लिए विशेषताओं (गेटर्स) को मैप करते हैं।
आपके उपयोग के मामले के लिए एक डीटीओ मॉडल ब्लेज़-पर्सिस्टेंस एंटिटी-व्यू के साथ निम्न जैसा दिख सकता है:
@EntityView(Request.class)
public interface RequestDto {
@IdMapping
Integer getId();
String getStatus();
@Mapping("services[status = :serviceStatus]")
Set<ServiceDto> getServices();
@EntityView(Service.class)
interface ServiceDto {
@IdMapping
Integer getId();
Integer getRequestId();
String getStatus();
}
}
क्वेरी करना इकाई दृश्य को किसी क्वेरी पर लागू करने का मामला है, सबसे सरल केवल आईडी द्वारा एक क्वेरी है।
RequestDto a = entityViewManager.find(entityManager, RequestDto.class, id);
स्प्रिंग डेटा एकीकरण आपको इसे लगभग स्प्रिंग डेटा प्रोजेक्शन की तरह उपयोग करने की अनुमति देता है:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features
List<RequestDto> findAll(@OptionalParam("serviceStatus") String serviceStatus);
सबसे अच्छी बात यह है कि यह केवल वही राज्य लाएगा जो वास्तव में आवश्यक है!