سؤال

قد تكون هذه إجابة سهلة للغاية ، لأنني متأكد من أنها ليست غير شائعة. أرى بعض الأسئلة المماثلة ، لكن لا شيء يبدو أنه يصف مشكلتي.

لديّ كائنان: سيارة وشخص. إنهم في علاقة كثيرة ، أي أن السيارة يمكن أن تكون مملوكة لأشخاص متعددين ، ويمكن لأي شخص امتلاك سيارات متعددة. Car لديه مجموعة تهيئة بتكاسل من Drivers:

@ManyToMany(targetEntity=Person.class, fetch=FetchType.LAZY)
private Set<Person> people;

أريد أن أجد جميع السيارات الزرقاء مع المالكين دون سن 25:

Criteria foo = persistenceManager.createCriteria(Car.class, "myCarAlias");
Criteria bar = foo.createCriteria("drivers", "myDriverAlias");
//add restrictions on foo and bar for blue and age, respectively
baz = foo.list();

مشكلتي هي عندما أتكرر من خلال القائمة والاتصال getDrivers() في كل سيارة ، تقوم بتهيئة المجموعة ويحصل على جميع برامج تشغيل هذه السيارة. أعتقد .list() ركضت لا تضع النتائج على كل سيارة.

أحصل على النتائج التي أتوقعها إذا قمت بتشغيل SQL Hibernate يدويًا ، لذلك أنا متأكد بشكل معقول من أن المعايير ليست هي المشكلة.

أستطيع أن أفهم سبب حدوث ذلك ، لكنني لست متأكدًا من كيفية الالتفاف عليه دون تكرار كل سيارة وتشغيل استعلام للسائقين على كل سيارة. أود تجنب القيام بذلك إن أمكن وسأقدر أي نصيحة.

شكرا مقدما!

هل كانت مفيدة؟

المحلول

هل كنت تأمل في أن تحتوي مجموعة السائقين لكل سيارة على أشخاص يطابقون معاييرك (أي أكثر من 25 عامًا)؟ بمعنى آخر ، أنت لا تريد مجموعة السائقين التي تحتوي على أشخاص يتجاوزون 25 عامًا؟

إذا كان هذا هو الحال ، فستحتاج إلى استخدام ResultTransformer (انظر القسم 15.4 من وثائق السبات) لأن السبات لا يسبق مجموعات مرشح قبل إرجاع النتائج.

ومع ذلك ، إذا كانت المشكلة هي أن مجموعة برامج التشغيل يتم تحميلها كسولًا وهذا غير مرغوب فيه ، فسيتعين تحديد وضع الجلب (عادةً ما أستخدم الانضمام لأن IIRC FetchMode.

baz = persistenceManager.createCriteria(Car.class, "myCarAlias")
    .setFetchMode("drivers", FetchMode.JOIN)
    // add additional restrictions here
    .list();

نصائح أخرى

القسم 15.5 من وثائق السبات. في الأساس ، يمكنك تعيين استراتيجية الجلب لاستفسارات المعايير الخاصة بك ، والتي يجب أن تكون لها الأسبقية على استراتيجية الجلب الأساسية التي حددتها للعلاقة.

المثال من الوثائق

List cats = sess.createCriteria(Cat.class)
   .add( Restrictions.like("name", "Fritz%") )
   .setFetchMode("mate", FetchMode.EAGER)
   .setFetchMode("kittens", FetchMode.EAGER)
   .list();

والوثائقhttp://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top