معايير السبات - الاستعلام عن الجداول في علاقة n:m
-
03-07-2019 - |
سؤال
أحاول إنشاء استعلام بمعايير السبات للسيناريو التالي:
- كيانان:المؤشر والتقرير (لكل منهما جداوله وفئاته وما إلى ذلك)
- يمكن استخدام المؤشر من صفر إلى العديد من التقارير
- يستخدم التقرير صفرًا للعديد من المؤشرات
- لذلك، لدي جدول تقاطع لتخزين العلاقة
- يتم تعريف العلاقة في كلا الفئتين وتخطيطات السبات الخاصة بهم
- في واجهة المستخدم، يمكن للمستخدم تحديد تقرير واحد أو عدة تقارير (من بين أشياء أخرى)، وأود الاستعلام عن قاعدة البيانات للمؤشرات المستخدمة في هذه التقارير
لقد حاولت ما يلي:
criteria.add(Restrictions.in("Reports", selectedReports));
ولكن كل ما أحصل عليه هو عبارة SQL غريبة
where this_.Indicator_ID in (?)
ثم استثناء JDBC (معلمة مفقودة)
أيه أفكار؟شكرًا.
ملحوظة:لقد بحثت في الاستعلام عن علاقة ManyToMany بمعايير السبات, ، ولكن الحل المقبول هو إنشاء سلسلة SQL مخصصة ...
المحلول
Criteria c = session.createCriteria(Indicator.class);
c.add(Restrictions.eq("someField", myObject).createCriteria("reports")
.add(Restrictions.eq("reportName", name);
c.list();
تحتاج إلى إنشاء معايير فرعية للكيان المحتجز في مجموعة على كيان آخر.
String[] selectedReportsId = {"1", "2", "3"};
c.add(Restrictions.eq("someField",myObject).createCriteria("reports")
.add(Restrictions.in("id", selectedReportsId);
ثم تحقق من الجزء المتعلق بتحويل النتائج من هنا:https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/querycriteria.html#querycriteria-associations
قد يلقي هذا أيضًا بعض الضوء على ما يمكنك فعله وفقًا للمعايير:http://www.hibernate.org/hib_docs/v3/api/org/hibernate/criterion/Restrictions.html
نصائح أخرى
إذا كان لا بد من ذلك، فإليك بعض الاقتراحات التي عادت بها Google بعد البحث عن "الإسبات hql متعدد إلى متعدد":
http://patf.net/blogs/index.php?blog=2&c=1&more=1&pb=1&tb=1&title=many_to_many_in_hql
ومن منتديات السبات :
http://forum.hibernate.org/viewtopic.php?p=2340747&sid=d4c8d2fcc16aed0201f73eb74619692a
ومن منتديات الربيع :
http://forum.springframework.org/showthread.php?t=36870
نأمل أن تساعد هذه.
في الوقت الحالي، هذه هي الطريقة التي جعلتني أعمل بها (بفضل zmf).
Criteria subcrit = criteria.createCriteria("Reports");
Disjunction dis = Restrictions.disjunction();
for (Reports r : selectedReports) {
dis.add(Restrictions.idEq(r.getID()));
}
subcrit.add(dis);
هذا هو بالضبط ما اقترحه zmf تقريبًا، كل ما أضفته هو الانفصال لبناء المعايير من المجموعة التي تم تمريرها.
كل ما تبقى عليك فعله هو محاولة استخدام المجموعة مباشرة...