JOIN
का उपयोग करना इसके लिए काम नहीं करता।
आपकी क्वेरी बल्कि अक्षम होगी क्योंकि यदि आप इस तरह से जुड़ने का उपयोग कर रहे हैं, तो आप एक कार्टेशियन उत्पाद बना रहे हैं। सभी अर्थहीन संयोजनों को डी-डुप्लिकेट करने से पहले, पुस्तकों और लेख तालिका के बीच, जिसके परिणामस्वरूप डेटाबेस और आपके जावा क्लाइंट दोनों में कुछ मेमोरी और CPU खपत होती है।
"सही" एसक्यूएल दृष्टिकोण का उपयोग करना होगा MULTISET
जैसा कि इस लेख में यहां बताया गया है
. दुर्भाग्य से, jOOQ 3.9 MULTISET
का समर्थन नहीं करता अभी तक
(न ही कई डेटाबेस करते हैं)। इसलिए, आपको दो अलग-अलग क्वेरी बनानी चाहिए:
- सभी पुस्तकें लाई जा रही हैं
- सभी लेख लाए जा रहे हैं
और फिर उन्हें एक ही ऑब्जेक्ट में मैप करने के लिए Java 8 Streams जैसी किसी चीज़ का उपयोग करें।
MULTISET
का उपयोग करना jOOQ 3.15
. से शुरू
सौभाग्य से, jOOQ 3.15 से शुरू होकर, SQL में MULTISET
का उपयोग करके संग्रह को नेस्ट करने के लिए एक आउट-ऑफ-द-बॉक्स समाधान है। . आपकी क्वेरी कुछ इस तरह दिखेगी:
प्रतिबिंब का उपयोग करना
List<Author> authors =
ctx.select(
AUTHOR.ID,
AUTHOR.NAME,
multiset(
select(BOOKS.TITLE)
.from(BOOKS)
.where(BOOKS.AUTHOR_ID.eq(AUTHOR.ID))
).as("books"),
multiset(
select(ARTICLES.TITLE)
.from(ARTICLES)
.where(ARTICLES.AUTHOR_ID.eq(AUTHOR.ID))
).as("articles")
)
.from(AUTHOR)
.where(AUTHOR.ID.eq(id))
.fetchInto(Author.class);
सुरक्षित प्रकार का उपयोग करना, विज्ञापन -हॉक रूपांतरण
List<Author> authors =
ctx.select(
AUTHOR.ID,
AUTHOR.NAME,
multiset(
select(BOOKS.TITLE)
.from(BOOKS)
.where(BOOKS.AUTHOR_ID.eq(AUTHOR.ID))
).as("books").convertFrom(r -> r.map(Record1::value1)),
multiset(
select(ARTICLES.TITLE)
.from(ARTICLES)
.where(ARTICLES.AUTHOR_ID.eq(AUTHOR.ID))
).as("articles").convertFrom(r -> r.map(Record1::value1))
)
.from(AUTHOR)
.where(AUTHOR.ID.eq(id))
.fetch(Records.mapping(Author::new));
MULTISET
के बारे में अधिक जानकारी के लिए , कृपया इस ब्लॉग पोस्ट को देखें
, या मैन्युअल अनुभाग:
JOOQ 3.14 से शुरू होकर SQL/XML या SQL/JSON का उपयोग करना
यदि आपका RDBMS इसका समर्थन करता है, तो jOOQ 3.14 से शुरू करके, आप SQL/XML या SQL/JSON के माध्यम से संग्रहों को नेस्ट कर सकते हैं। आप एक दस्तावेज़ तैयार कर सकते हैं, और फिर इसे अपने जावा कक्षाओं में वापस मैप करने के लिए जीसन, जैक्सन, या जेएक्सबी जैसे कुछ का उपयोग कर सकते हैं। उदाहरण के लिए:
List<Author> authors =
ctx.select(
AUTHOR.ID,
AUTHOR.NAME,
field(
select(jsonArrayAgg(BOOKS.TITLE))
.from(BOOKS)
.where(BOOKS.AUTHOR_ID.eq(AUTHOR.ID))
).as("books"),
field(
select(jsonArrayAgg(ARTICLES.TITLE))
.from(ARTICLES)
.where(ARTICLES.AUTHOR_ID.eq(AUTHOR.ID))
).as("articles")
)
.from(AUTHOR)
.where(AUTHOR.ID.eq(id))
.fetchInto(Author.class);
ध्यान दें कि JSON_ARRAYAGG()
खाली सेटों को NULL
. में एकत्रित करता है , खाली में नहीं []
. अगर यह समस्या है, तो COALESCE()
का इस्तेमाल करें