ربط قيم متعددة في السبات باستخدام إطار العمل
-
26-09-2019 - |
سؤال
أحاول بناء استعلام في إطار اللعب ، لدي
select * from Candidate c where (:schools member of c.schools)
بعد ربط: المدرسة مع قائمة بعنصر واحد ، فإنه يعيد نتيجة ، ولكن إذا قمت بربط القائمة بعناصر متعددة لا يحدث شيء.
Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: {vector} [select c from models.Candidate c where (:schools0_, :schools1_ member of c.schools) group by c.id order by RAND()]
في الواقع أنا بحاجة إلى شيء مثل
select * from candidate where schools in (x,x,x,x,x);
العلاقة بين المرشح والمدرسة في الجدول المرتبط.
هل هناك أي طريقة لربط قيم متعددة؟
المحلول
مع Hibernate ، يمكنك أيضًا استخدام القائمة نفسها مباشرة.
select c from Candidate c join c.schools as school where school.id in (:schools)
على سبيل المثال ، فإن نوع المعلمة: المدارس تتم كتابة معرفاتك ، على سبيل المثال List<Int>
أو List<Long>
.
نصائح أخرى
في الواقع وجدت مكان المشكلة - عضو في يمكن استخدامها فقط بقيمة واحدة وتعمل بشكل جيد. عندما نحتاج إلى استخدام قيم متعددة ، فإن الأفضل هو استخدام SQL القياسي في:
select c from Candidate c inner join c.schools as school where school.id in (25980,25981)"
مطلوب الانضمام إلى الجداول المرتبطة - لا يمكننا استخدام C.Schools.Id ، لذلك نحن بحاجة إلى الانضمام الداخلي C.Schools مع الاسم المستعار لتحديد العمود.
أعتقد أنه يجب على جميع المبتدئين التحقق http://www.javatx.cn/hibernate/reference/en/html/queryhql.html