سؤال

لجعلها قصيرة:السبات لا يدعم التوقعات والاستعلام عن طريق المثال؟لقد وجدت هذا المنصب:

الرمز هو هذا:

User usr = new User();
usr.setCity = 'TEST';
getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Example.create(usr))

كما قال الملصق الآخر، يحتفظ SQL الذي تم إنشاؤه بوجود فئة حيث تشير إلى فقط y0_= ؟بدلاً من this_.city.

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

حتى أنني حاولت استخدام الاسم المستعار للعرض والمحولات، لكنه لم ينجح:

User usr = new User();
usr.setCity = 'TEST';
getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Example.create(usr)).setResultTransformer(Transformers.aliasToBean(User.class));

هل استخدم أي شخص التوقعات والاستعلام بالقدوة؟

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

المحلول

هل يمكنني رؤية فئة المستخدم الخاصة بك؟هذا فقط باستخدام القيود الموضحة أدناه.لا أفهم سبب اختلاف القيود حقًا عن الأمثلة (أعتقد أنه يتم تجاهل الحقول الفارغة افتراضيًا في الأمثلة).

getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Restrictions.eq("city", "TEST")))
.setResultTransformer(Transformers.aliasToBean(User.class))
.list();

لم أستخدم alaistToBean مطلقًا، لكنني قرأت عنه للتو.يمكنك أيضًا تكرار النتائج ..

List<Object> rows = criteria.list();
for(Object r: rows){
  Object[] row = (Object[]) r;
  Type t = ((<Type>) row[0]);
}

إذا كان عليك ذلك، فيمكنك تعبئة المستخدم بنفسك بهذه الطريقة يدويًا.

من الصعب النظر في المشكلة دون الحصول على مزيد من المعلومات لتشخيص المشكلة.

نصائح أخرى

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

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

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("sectionHeader", sectionHeaderVar)) // <- Problem!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

سوف تنتج هذا SQL:

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(y1_) like ? ) 

الذي كان يسبب خطأ: java.sql.SQLException:أورا-00904:"Y1_":معرف غير صالح

ولكن، عندما قمت بتغيير التقييد الخاص بي لاستخدام "هذا"، على النحو التالي:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("this.sectionHeader", sectionHeaderVar)) // <- Problem Solved!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

أنتجت SQL التالية وتم حل مشكلتي.

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(this_.SECTION_HEADER) like ? ) 

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

المشكلة الحقيقية هنا هي وجود خطأ في وضع السبات حيث يستخدم الأسماء المستعارة لقائمة التحديد في جملة المكان:

http://opensource.atlassian.com/projects/hibernate/browse/HHH-817

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

أنا أواجه مشكلة مماثلة.أنا أستخدم الاستعلام حسب المثال وأريد فرز النتائج حسب حقل مخصص.في SQL سأفعل شيئًا مثل:

select pageNo, abs(pageNo - 434) as diff
from relA
where year = 2009
order by diff

إنه يعمل بشكل جيد بدون الترتيب حسب البند.ما حصلت عليه هو

Criteria crit = getSession().createCriteria(Entity.class);
crit.add(exampleObject);
ProjectionList pl = Projections.projectionList();
pl.add( Projections.property("id") );
pl.add(Projections.sqlProjection("abs(`pageNo`-"+pageNo+") as diff", new String[] {"diff"}, types ));
crit.setProjection(pl);

ولكن عندما أضيف

crit.addOrder(Order.asc("diff"));

أحصل على org.hibernate.QueryException:لا يمكن حل الملكية:فرق استثناء.الحل البديل مع هذا لا يعمل سواء.

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

ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("id"));
pl.add(Projections.sqlProjection("abs(`pageNo`-" + pageNo + ") as diff", new String[] {"diff"}, types ), diff); ---- solution
crit.addOrder(Order.asc("diff"));
crit.setProjection(pl);

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

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