java - ومتى - شرح الجدول الدوري




معايير السبات: ربط الجدول بدون اقتران معين (4)

أود استخدام معايير api في Hibernate لصياغة استعلام معين ينضم إلى كيانين. لنفترض أن لدي كيانين ، هما Pet و Owner مع مالك يمتلك العديد من الحيوانات الأليفة ، ولكن لا يتم تعيين هذا الارتباط في التعليقات التوضيحية Java أو xml.

مع hql ، يمكنني تحديد المالكين الذين لديهم حيوان أليف يسمى "fido" عن طريق تحديد الانضمام في الاستعلام (بدلاً من إضافة مجموعة من الحيوانات الأليفة إلى فئة المالك).

هل يمكن فعل الشيء نفسه باستخدام معايير السبات؟ إذا كيف ذلك؟

شكرا ، ياء


في NHibernate ، يمكنك استخدام الاستعلامات الفرعية التي يتم تعريفها على أنها DetachedCriteria. لست متأكدا مما إذا كان يعمل نفس الشيء في Java ، على الأرجح هو نفسه:

DetachedCriteria pets = DetachedCriteria.For<Pet>("pet")
  .SetProjection(Projections.Property("pet.ownername"))
  .Add(/* some filters */ );

session.CreateCriteria(typeof(Owner))
  .Add(Subqueries.PropertyIn("name", pets);

يفترض أنه تم ضمه باستخدام اسم المالك.


ما أفهمه هو أنك إذا قمت بذلك باستخدام HQL ، فأنت تقوم بإنشاء ارتباط ديكارت مع فلتر بدلاً من صلة داخلية. لا تدعم استعلامات المعايير إجراء ذلك.


هناك SQLCriterion ، والتي يمكنك إعطاء SQL التعسفي ، وإضافة إلى Criteria الخاصة بك. في سلسلة SQL ، سيتم استبدال الرمز المميز {alias} "باسم مستعار للكيان الرئيسي."


Criterion ownerCriterion = Restrictions.sqlRestriction(SELECT ownerId FROM   Owner WHERE ownerName ='bob');
Criteria criteria = getSession().createCriteria(Pet.class);
criteria.createCriteria("ownerId").add(ownerCriterion);




criteria