معايير السبات API - كيفية الطلب حسب حجم التجميع؟

StackOverflow https://stackoverflow.com/questions/1254306

  •  12-09-2019
  •  | 
  •  

سؤال

على افتراض أنني أعاني من صنفات المستخدم ومجموعة Usergroup. هناك مجموعة اختيارية 1-العديد من جمعية المستخدمين وتعيين الارتباط من كلا الجانبين (جانب Usergroup عبر خاصية يسمى "الأعضاء"، وهو ما هو HASHST، جانب المستخدم عبر خاصية "مجموعة").

باستخدام API المعايير، كيف يمكنني الاستعلام عن جميع المجموعات، مرتبة حسب عدد أعضاء المجموعة؟

(تحرير) كان ينبغي علي أن أشار إليه عندما سألت أن يتم إجراء هذا الصفحات في SQL، لذلك يجب أيضا إجراء الطلب في SQL إذا كان ذلك ممكنا.

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

المحلول

سيكون هناك خيار آخر هو استخدام التوضيح التوضيحي في Formula في الأساس ما يعادل إنشاء مختارة متداخلة حتى تتمكن من الحصول على التهم.

في الخاصية DB كائناتك / عضو في السؤال (الذي يجب عليك إنشائه)، أضف التوضيح إلى Getter مثل:

تضمين التغريدة لا تضمين الإدارة }

ثم استهداف العضو مباشرة للحصول على القيم الخاصة بك ...

ملاحظة: كن على دراية أنه عند تحديد SQL ضمن التعليق التوضيحي في الصيغة، يجب عليك تحديد أسماء الحقول مباشرة عند الرجوع إلى جدول الكائنات الحالية (هذا) كما صفقات السبات بهذا نفسها. لذلك في مكانك حيث يمكنك استخدام معرف الخاص بك فقط أو أيا كان بمفرده عند الرجوع إلى جدول الكائنات الحالية التي أظن أن Usergroup.

اضطررت إلى أن يكون لدي صارما على ممتلكي الجديد من أجل السبات للعمل ومنع المترجم من الشكوى.

قد تكون هناك طرق ذكية أخرى لاستخدامFormula، لكنني جديد جدا على هذا ولا يبدو أن هناك وثائقا كبيرا في الموضوع ...

إذا لم تكن قد استخدمت أبدا، فستكون مختارات متداخلة من قبل، فقد تكون فكرة بالنسبة لك فقط إعادة إنشاء SQL أولا - التي ساعدتني.

أتمنى أن يساعدك هذا

نصائح أخرى

ليس من الممكن افتراضيا باستخدام Citeria API ولكن يمكنك تمديد Org.hibernate.ceriterion.orderion. هذه المقالة تدور حول كيفية تمديد هذه الفئة: http://blog.tremend.ro/2008/06/10/how-to-order-by-a-custom-sql-formulaExpression-when-using-hibernate-criteria-api.

طفلي هو:

public class SizeOrder extends Order {

    protected String propertyName;
    protected boolean ascending;

    protected SizeOrder(String propertyName, boolean ascending) {
        super(propertyName, ascending);
        this.propertyName = propertyName;
        this.ascending = ascending;
    }

    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
        String role = criteriaQuery.getEntityName(criteria, propertyName) + '.' + criteriaQuery.getPropertyName(propertyName);
        QueryableCollection cp = (QueryableCollection) criteriaQuery.getFactory().getCollectionPersister(role);

        String[] fk = cp.getKeyColumnNames();
        String[] pk = ((Loadable) cp.getOwnerEntityPersister())
                .getIdentifierColumnNames();
        return " (select count(*) from " + cp.getTableName() + " where "
                + new ConditionFragment()
                        .setTableAlias(
                                criteriaQuery.getSQLAlias(criteria, propertyName)
                        ).setCondition(pk, fk)
                    .toFragmentString() + ") "
                + (ascending ? "asc" : "desc");
    }

    public static SizeOrder asc(String propertyName) {
        return new SizeOrder(propertyName, true);
    }
    public static SizeOrder desc(String propertyName) {
        return new SizeOrder(propertyName, false);
    }
}

تعتمد طريقة Tosqlstring على Org.hibernate.ceriterion.sizeExpression. (مصدر: http://javasourcecode.org/html/open-source/hibernate/hopernate-3.6.0.final/org/hopernate/criterion/sizeexpression.java.html.)

مثال على الاستخدام:

hibernateSession.createCriteria(UserGroup.class).addOrder( SizeOrder.asc("members") ).list();

سيؤدي هذا إلى سرد مجموعات المستخدمين المطلوبة بحجم الأعضاء تصاعدي، حيث "الأعضاء" هو مجموعة المستخدم في كيان Usergroup.

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

تحديث، أدخل (اختياري - الإعدادات الافتراضية إلى TRUE): يحدد أنه يجب تضمين أعمدة المعينة في تحديث SQL و / أو إدراج البيانات. يسمح الإعداد إلى FALSE بميزة "مشتقة" نقية "يتم تهيئة قيمتها من بعض الممتلكات الأخرى التي توصي نفس العمود (الأعمدة)، أو عن طريق الزناد أو التطبيق الآخر.

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

إذا كان يعمل، فمن المحتمل أن يتم ذلك كفرز في الذاكرة، لأنه لن يتمكن من تعيينه إلى SQL. إذا كانت هذه مشكلة، فإن نفس الرابط أعلاه المستندات كيفية تطبيق خاصية مشتقة باستخدام جزء مخصص SQL:

ميزة قوية خصائص مشتقة. هذه الخصائص هي بحكم التعريف للقراءة فقط. تم حساب قيمة الخاصية في وقت الحمل. أنت تعلن الحساب كتعبير SQL. هذا يترجم بعد ذلك إلى SELECERY OL SELECT SQUACERY في استعلام SQL الذي يحمل مثيل:

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