السبات كيفية استرداد التسلسل الهرمي كائن
سؤال
لدي التالية الفاصوليا المهمة ، ServerDetails و ApplicationDetails.أتمنى لاسترداد كافة المهام الخادم الخاص بهم تفاصيل تفاصيل التطبيق على أساس محدد اسم التطبيق.
من النتيجة أتوقع أن تكون قادرة على استرداد البيانات بطريقة مثل:المهمة.getServers().getApplicationDetails()
في واقع الأمر, أحصل على ما يبدو أن تكون مسطحة البيانات تمثيل ككائن[].
هل هناك أي طريقة أن تفعل ما اقترح ؟
التالي هو قانون بلدي...
class Task {
private String taskId;
private Set<ServerDetails> servers;
}
class ServerDetails {
private String id;
private Set<ApplicationDetails> applications;
}
class ApplicationDetails {
private String id;
}
HQL:
StringBuilder hql = new StringBuilder(256);
hql.append("FROM Task h, ServerDetails ser, ApplicationDetails app ");
hql.append("WHERE h.executionDate > ");
hql.append("to_date('");
hql.append(DBDateFormatter.getInstance().formatDate(cal));
hql.append("', '");
hql.append(DBDateFormatter.getInstance().getOracleDateFormat());
hql.append("') and h.id = ser.task.id and ser.id = app.server and app.name = 'XXX'");
hql.append(" order by h.executionDate desc");
String hql = hql.toString();
Query query = session.createQuery(hql);
results = (List<Object[]>) query.list();
المحلول
يجب عليك فقط استرداد الهدف الرئيسي.
الأخرى, يمكنك:
- تنقل لهم حين
Session
قد لا تكون مغلقة (يعمل استفسارات إضافية حسب الحاجة ، المعروفة باسم كسول ، هذا هو المثل الأعلى لسهولة الاستخدام) - واسترجاعها في الاستعلام الأصلي باستخدام
fetch
الكلمات الرئيسية.
على سبيل المثال:
SELECT h
FROM Task h
JOIN FETCH h.serveurs ser
JOIN FETCH ser.applications app
WHERE h.executionDate >
.... // no need to specify the joins
سوف تكون قادرة على استرداد البيانات بطريقة مثل:
task.getServers().getApplicationDetails()
نصائح أخرى
ويمكنك استرداد الرسم البياني الكائن كما قال آخرون باستخدام LEFT JOIN FECH. واحد crevent لقد وجدت عند استرداد الرسوم البيانية وجوه، عندما يسير علاقة عديدة الى واحد لا يمكنك المشي مرة أخرى من دون الوصول إلى قاعدة بيانات إضافية.