بنية كائن جيدة لنتائج الصلة الخارجية اليسرى للإسبات
-
05-07-2019 - |
سؤال
أحتاج إلى إجراء استعلام ربط خارجي يسترد كافة التعريفات وأي خصائص مرتبطة بها مرتبطة بشركة معينة.
لدي كائنين من نماذج السبات:
class PropertyDefinition {
@Id
private Long id;
@Column
private String name;
@OneToMany(mappedBy = "propertyDefinition")
private Set<Property> properties = new HashSet<Property>();
}
class Property {
@Id
private Long id;
@ManyToOne
private Integer companyId;
@ManyToOne
private PropertyDefinition propertyDefinition;
}
لذلك ينتهي الاستعلام بالشكل التالي:
from PropertyDefinition as pd left join pd.properties as props with props.companyId = :companyId
لذلك كل شيء خوخي حتى الآن.المشكلة التي أواجهها هي ما نوع البنية التي أقوم بتخزين البيانات التي تم إرجاعها فيها؟يقوم Hibernate بإرجاع قائمة حيث يكون [0] هو PropertyDefinition (يجب ألا يكون فارغًا أبدًا) و[1] هو الخاصية التي من المحتمل أن تكون فارغة.
مشاكلي:
- إنه أمر بغيض وغير ودود للغاية لتمرير قائمة الكائنات [] العناصر.
- لا يمكنني التمسك بـ PropertyDefinition لأن قائمة الخصائص التي يحتفظ بها لا تقتصر على الشركة.
- يمكنني إنشاء كائن بسيط يحتوي على مرجع إلى PropertyDefinition وربما خاصية فارغة ولكن من غير الفعال أن تضطر إلى التكرار عبر القائمة بأكملها ووضع كل منها في هذا الكائن الجديد.
هل لدى أي شخص اقتراح لاستعلام أفضل أو بنية رسم خرائط أفضل؟سأقدر حقًا أي مساعدة.
المحلول
حسنًا، من الأفضل التعامل مع الانضمام الأيسر عادةً عبر أحضر والتي تقوم بإرجاع قائمة كائنات الحاوية مع المجموعات المأهولة.ومع ذلك، بما أنك تستخدم with
الشرط، وهذا لن يعمل بالنسبة لك.
إذا كنت تريد إنشاء حامل بسيط لـ PropertyDefinition
و Property
باستخدام المُنشئ العام المناسب، يمكنك إخبار Hibernate بإرجاع ما يلي:
select new Holder(pd, props)
from PropertyDefinition as pd
left join pd.properties as props
with props.companyId = :companyId
وينبغي أن تهتم بالمشكلات التي ذكرتها؛إنه ليس مثاليًا ولكنه ربما يكون الحل الأفضل المتاح في ظل هذه الظروف.