स्प्रिंग डेटा JPA एम्बेडेड ऑब्जेक्ट प्रॉपर्टी द्वारा खोजा जाता है


101

मैं एक स्प्रिंग डेटा जेपीए रिपॉजिटरी इंटरफ़ेस विधि हस्ताक्षर लिखना चाहता हूं जो मुझे उस इकाई में एक एम्बेडेड ऑब्जेक्ट की संपत्ति के साथ संस्थाओं को खोजने देगा। क्या किसी को पता है कि क्या यह संभव है, और यदि ऐसा है तो कैसे?

यहाँ मेरा कोड है:

@Entity
@Table(name = "BOOK_UPDATE_QUEUE", indexes = { uniqueConstraints = @UniqueConstraint(columnNames = {
        "bookId", "region" }, name = "UK01_BOOK_UPDATE_QUEUE"))
public class QueuedBook implements Serializable {

    @Embedded
    @NotNull
    private BookId bookId;

    ...

}

@Embeddable
public class BookId implements Serializable {

    @NotNull
    @Size(min=1, max=40)
    private String bookId;

    @NotNull
    @Enumerated(EnumType.STRING)
    private Region region;

    ...

}

public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {

    //I'd like to write a method like this, but can't figure out how to search by region,
    //when region is actually a part of the embedded BookId
    Page<QueuedBook> findByRegion(Region region, Pageable pageable);

}

क्या मैं स्प्रिंग डेटा का उपयोग करके इसके लिए एक प्रश्न लिख सकता हूं?


4
findByBookIdRegion(Region region, Pageable pageable)चाल नहीं करता है ?
ओलिवर ड्रॉटबोहम

2
हां, यह करता है। मुझे इसके लिए कहीं भी प्रलेखन नहीं मिला। क्या यह छिपा है या निहित है कहीं मैंने नहीं देखा?
कोराथन

उसे एक उत्तर में बदल दिया और संदर्भ डॉक्स के संबंधित अनुभाग के लिए एक लिंक जोड़ दिया।
ओलिवर ड्रोटबोहम

जवाबों:


145

इस विधि का नाम चाल करना चाहिए:

Page<QueuedBook> findByBookIdRegion(Region region, Pageable pageable);

संदर्भ डॉक्स की क्वेरी व्युत्पत्ति के बारे में अनुभाग में अधिक जानकारी ।


11
अगर मेरे पास एंबेडेडेबल की सूची है तो क्या होगा? या तत्व संग्रह?
user962206

यदि हम 3 प्रीपरेटी के साथ फाइब क्वेरी चाहते हैं तो सिंटैक्स क्या होगा? क्या यह findByPro1AndPro2AndPro3 जैसा है?
सुरेंद्रपांडे

क्या इस तरह की क्वेरी का परिणाम हमेशा आंतरिक जुड़ाव होता है? मैं कर रहा हूँ One findByIdAndTwoId(Long oneId, Long twoId);और परिणाम की एक क्वेरी में परिणाम:select ...... from one one_ left outer join two two_ on one_.two_id = two_.id where one_id = ? and two_.id = ?
TroJaN

44

ऊपर - findByBookIdRegion () ने मेरे लिए काम नहीं किया। निम्न स्ट्रिंग डेटा JPA की नवीनतम रिलीज़ के साथ काम करता है:

Page<QueuedBook> findByBookId_Region(Region region, Pageable pageable);

3
आपके मामले अस्पष्टता से संबंधित हो सकते हैं जैसा कि docs.spring.io/spring-data/jpa/docs/current/reference/html/…
Marcello de Sales

9

यदि आप BookId को एक संयुक्त प्राथमिक कुंजी के रूप में उपयोग कर रहे हैं, तो अपना इंटरफ़ेस बदलना याद रखें:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {

सेवा:

public interface QueuedBookRepo extends JpaRepository<QueuedBook, BookId> {

और इस तरह से अपने QueuedBook वर्ग में एनोटेशन @Embedded को @EmbeddedId में बदलें:

public class QueuedBook implements Serializable {

@EmbeddedId
@NotNull
private BookId bookId;

...

1

मेरे अनुसार, वसंत सभी मामलों को आसानी से नहीं संभालता है। आपके मामले में निम्नलिखित को चाल चलनी चाहिए

Page<QueuedBook> findByBookIdRegion(Region region, Pageable pageable);  

या

Page<QueuedBook> findByBookId_Region(Region region, Pageable pageable);

हालाँकि, यह उन क्षेत्रों के नामकरण सम्मेलन पर भी निर्भर करता है, जो आपकी @Embeddableकक्षा में हैं,

उदाहरण के लिए, निम्नलिखित फ़ील्ड किसी भी शैली में काम नहीं कर सकती है जो ऊपर उल्लिखित है

private String cRcdDel;

मैंने दोनों मामलों के साथ प्रयास किया (निम्नानुसार) और यह काम नहीं किया (ऐसा लगता है जैसे वसंत इस प्रकार के नामकरण सम्मेलनों को संभाल नहीं करता है (यानी कई कैप्स के लिए, विशेष रूप से शुरुआत में - दूसरा अक्षर) इस बारे में निश्चित नहीं है कि क्या है हालांकि एकमात्र मामला)

Page<QueuedBook> findByBookIdCRcdDel(String cRcdDel, Pageable pageable); 

या

Page<QueuedBook> findByBookIdCRcdDel(String cRcdDel, Pageable pageable);

जब मैंने स्तंभ का नाम बदला

private String rcdDel;

मेरे निम्नलिखित समाधान बिना किसी समस्या के ठीक काम करते हैं:

Page<QueuedBook> findByBookIdRcdDel(String rcdDel, Pageable pageable); 

या

Page<QueuedBook> findByBookIdRcdDel(String rcdDel, Pageable pageable);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.