سؤال

كما يقول عنوان السؤال ، أحاول وضع معايير إسقاط للاستعلام عن سمات الجدول فقط.

لذلك لدي جدول/فئة شخص ولديه حوالي 40 سمات. أريد أن تحصل معايير على عدد ديناميكي من السمات ، دعنا نقول 10 أو 11 أو 12 (شروط SQL select firstname, lastname from person) وكنت أفعل ذلك مثل هذا:

Transaction tx = session.beginTransaction();
Criteria crit = session.createCriteria(Person.class);
crit.setCacheable(true);
ProjectionList projList = Projections.projectionList();
projList.add(Projections.property("id"));
Criterias c = null;
 for (int i = 0; i < checked.size(); i++) {
        Attribute attr = checked.elementAt(i);
        switch (attr) {
            case LASTNAME:
                projList.add(Projections.property("lastName"));
                c = enumMap.get(attr);
                if (c.isChanged()) {
                    String tmp = (String) c.getAnswer();
                    tmp = tmp.replace('*', '%');
                    crit.add(Restrictions.like("lastName", tmp));
                    crit.addOrder(Order.asc("lastName"));
                }
            case ...THE REST .....
            }
    crit.setProjection(projList);
    retList = crit.list();
    tx.commit();
    return retList;

ويعيد أن retList العناصر ليست من Person.class:

info [awt-eventqueue-0] (UserGroupManagerApp.java127)-[ljava.lang.object ؛@14b9b80
fatal [awt-eventqueue-0] (login.java78)-java.lang.classcastexception: [ljava.lang.object ؛ لا يمكن إلقاؤه إلى usergroupmanager.model.db.person java.lang.classcastexception: [ljava.lang.object ؛ لا يمكن إلقاؤه إلى usergroupmanager.model.db.person

الرجاء المساعدة ، في الوقت الحالي ، أقوم بإدراج كل 40 عامًا ، ويستغرق وقت الاستعلام ولا يعجبني ذلك. أنا أبحث أيضًا عن حل بديل يساعدني في حل هذا. قرأت عن ResultTransformer لكن لم يجد كيفية استخدامه في حالتي.

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

المحلول

ljava.lang.Object ؛ لا يمكن إلقاؤه إلى usergroupmanager.model.db.person

يقول بكلمات نظيفة Object[] لا يمكن طرحه Person. عندما تقوم بإسقاط ، ستحصل على السمات التي حددتها كمجموعة من الكائنات بدلاً من كيان مائي.

الرمز الخاص بك مفقود إعلان retlist. أعتقد أنها خام List التي ألقيت بها إلى أ List<Person> مكان ما. فقط استبدل ذلك بـ List<Object[]>.

نصائح أخرى

يمكنك استخدام المعايير.

هناك بعض المحولات المقدمة في السبات. إذا لم يكن لدى شخصك أي ارتباط يستخدم هذا:

criteria.setResultTransformer(Transformers.aliasToBean(Person.class));

ولكن إذا كان لدى الشخص أي ارتباط ، فكر في استخدام Seimos في http://github.com/moesio/seimos

يمكن حفظ الكثير من التعليمات البرمجية إذا كنت تستخدمه بدلاً من ذلك معايير.

إذا كنت تستخدم إسقاطًا في السبات ، فأنت لا تستفسر عن جميع احتياجات السبات التي تحتاجها الإسبات لإنشاء الكائنات. وبالتالي لا يمكن لـ Hibernate إنشاء الكائنات.

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

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