SQL, और/या jOOQ के साथ नेस्टेड संग्रह को अमल में लाने के कई तरीके हैं। मैं उनमें से कुछ के माध्यम से जा रहा हूँ:
जुड़ने का उपयोग करना
यदि आप उन संग्रहों को गहराई से घोंसला नहीं बनाते हैं, तो अपने परिणामों को JOIN
के साथ सामान्यीकरण (समतल) करना आपके लिए ट्रिक कर सकता है, बिना बहुत अधिक ओवरहेड जोड़े क्योंकि डेटा डुप्लिकेट किया जा रहा है। अनिवार्य रूप से, आप लिखेंगे:
Map<ExperimentRecord, Result<Record>> map =
DSL.using(configuration)
.select()
.from(EXPERIMENT)
.join(TAGS)
.on(...)
.fetchGroups(EXPERIMENT);
उपरोक्त मानचित्र में कुंजी के रूप में प्रयोग रिकॉर्ड हैं, और सभी टैग वाले नेस्टेड संग्रह मानों के रूप में हैं।
दो क्वेरी बनाना
यदि आप एक जटिल ऑब्जेक्ट ग्राफ़ को अमल में लाना चाहते हैं, तो जॉइन का उपयोग करना अब इष्टतम नहीं हो सकता है। इसके बजाय, आप शायद अपने क्लाइंट में दो अलग-अलग प्रश्नों से डेटा एकत्र करना चाहते हैं:
Result<ExperimentRecord> experiments =
DSL.using(configuration)
.selectFrom(EXPERIMENT)
.fetch();
और
Result<TagsRecord> tags =
DSL.using(configuration)
.selectFrom(TAGS)
.where(... restrict to the previous experiments ...)
.fetch();
और अब, दो परिणामों को अपने क्लाइंट की मेमोरी में मर्ज करें, उदा.
experiments.stream()
.map(e -> new ExperimentWithTags(
e,
tags.stream()
.filter(t -> e.getId().equals(t.getExperimentId()))
.collect(Collectors.toList())
));
SQL/XML या SQL/JSON का उपयोग करके संग्रहों को नेस्ट करना
इस प्रश्न के लिए इसकी आवश्यकता नहीं थी, लेकिन अन्य लोगों को यह प्रश्न jOOQ के साथ कई रिश्तों को नेस्ट करने के तरीके की तलाश में मिल सकता है। मैंने यहां एक उत्तर दिया है . jOOQ 3.14 से शुरू करके, आप अपने RDBMS की SQL/XML या SQL/JSON क्षमताओं का उपयोग कर सकते हैं, और फिर जैक्सन, Gson, या JAXB का उपयोग इस तरह के संग्रहों को नेस्ट करने के लिए कर सकते हैं:
List<Experiment> experiments =
ctx.select(
EXPERIMENT.asterisk(),
field(
select(jsonArrayAgg(jsonObject(TAGS.fields())))
.from(TAGS)
.where(TAGS.EXPERIMENT_ID.eq(EXPERIMENT.ID))
).as("tags")
)
.from(EXPERIMENT)
.fetchInto(Experiment.class);
जहां Experiment
इस तरह एक कस्टम जावा वर्ग है:
class Experiment {
long id;
String name;
List<Tag> tags;
}
class Tag {
long id;
String name;
}
MULTISET
का उपयोग करके संग्रह को नेस्ट करना
उपरोक्त से भी बेहतर, आप jOOQ 3.15 के नए MULTISET
के पीछे SQL/XML या SQL/JSON का उपयोग करके छिपा सकते हैं ऑपरेटर समर्थन
. यह मानते हुए कि उपरोक्त जावा कक्षाएं जावा 16 रिकॉर्ड (या कोई अन्य अपरिवर्तनीय वर्ग) हैं, आप अपने डीटीओ में नेस्टेड संग्रह प्रकार को सुरक्षित रूप से मैप भी कर सकते हैं:
List<Experiment> experiments =
ctx.select(
EXPERIMENT.ID,
EXPERIMENT.NAME,
multiset(
select(TAGS.ID, TAGS.NAME)
.from(TAGS)
.where(TAGS.EXPERIMENT_ID.eq(EXPERIMENT.ID))
).as("tags").convertFrom(r -> r.map(Records.mapping(Tag::new)))
)
.from(EXPERIMENT)
.fetch(Records.mapping(Experiment::new));
जहां Experiment
इस तरह एक कस्टम जावा वर्ग है:
record Experiment(long id, String name, List<Tag> tags) {}
record Tag(long id, String name) {}
अधिक जानकारी के लिए यह ब्लॉग पोस्ट भी देखें ।