سؤال

وأنا أحاول أن تفعل الاستعلام نتيجة ترقيم الصفحات مع السبات وdisplaytag، والسبات الأشياء DetachedCriteria يبذلون قصارى جهدهم للوقوف في الطريق. اسمحوا لي أن أشرح ...

وأسهل طريقة للقيام ترقيم الصفحات مع displaytag يبدو أن تنفيذ واجهة PaginatedList التي لديها، من بين أمور أخرى، الطرق التالية:

/* Gets the total number of results. */
int getFullListSize();

/* Gets the current page of results. */
List getList();

/* Gets the page size. */
int getObjectsPerPage();

/* Gets the current page number. */
int getPageNumber();

/* Get the sorting column and direction */
String getSortCriterion();
SortOrderEnum getSortDirection();

وأنا أفكر في رمي بلدي تنفيذ PaginatedList كائن معايير والسماح لها بالعمل جنبا إلى جنب theese وخطوط ...

getFullListSize() {
    criteria.setProjection(Projections.rowCount());
    return ((Long) criteria.uniqueResult()).intValue();
}

getList() {
    if (getSortDirection() == SortOrderEnum.ASCENDING) {
        criteria.addOrder(Order.asc(getSortCriterion());
    } else if (getSortDirection() == SortOrderEnum.DECENDING) {
        criteria.addOrder(Order.desc(getSortCriterion());
    }
    return criteria.list((getPageNumber() - 1) * getObjectsPerPage(),
                         getObjectsPerPage());
}

ولكن هذا لا يعمل، لأن addOrder() أو المكالمات setProjection() تعديل معايير وجوه جعلها صالحة للاستعمال في لالاستدعاءات المتتالية. أنا لست متأكدا تماما من أجل من المكالمات، ولكن ديسيبل يلقي خطأ على getFullListSize() تحاول القيام ب "select count(*) ... order by ..." وهذا خطأ واضح.

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

على تحديث : في يبدو أن يسمى getList أولا، ويسمى getFullListSize عدة مرات بعد، لذلك، في أقرب وقت هناك لترتيب مرت في ستفشل getFullListSize. ومن المنطقي أن تصل إلى ديسيبل مرة واحدة فقط (في getList أقول) وتخزين النتائج، دون الحاجة إلى نسخ / إعادة تعيين الكائن Criteria، ولكن لا يزال ...

على تحديث (مرة أخرى) : في ننسى أنه بمجرد لقد فعلت count لا أستطيع أن أفعل في select، والعكس بالعكس. أنا فعلا بحاجة كائنين Criteria متميزة.

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

المحلول

وكذلك، DetachedCriteria هي تسلسل، لذلك كنت قد بنيت في (إذا كان غير مصقول) دعم استنساخ عميق. هل يمكن أن تسلسل المعايير الأولية إلى بايت [] مرة واحدة على البناء، ثم إلغاء تسلسل في كل مرة تريد استخدامها.

نصائح أخرى

Criteria.setProjection(null);
Criteria.setResultTransformer(Criteria.ROOT_ENTITY);

هل فعال "إعادة تعيين" المعايير بين الإسقاط ROWCOUNT وتنفيذ المعايير نفسها.

وأود أن نتأكد لم تتم إضافته النظام الخاص بك قبل القيام ROWCOUNT، وأنها سوف ابطاء الامور. بلدي تنفيذ PaginatedList يعمل ALWAYS استعلام العد قبل البحث عن النتائج، لذلك يأمر ليست قضية.

<وأ href = "http://weblogs.asp.net/stefansedich/archive/2008/10/03/paging-with-nhibernate-using-a-custom-extension-method-to-make-it- easier.aspx "يختلط =" نوفولو noreferrer "> http://weblogs.asp.net/stefansedich/archive/2008/10/03/paging-with-nhibernate-using-a-custom-extension-method-to-make -من-easier.aspx

في هذا المنصب رصدت طريقة CriteriaTransformer.clone.

وهذا يجب نسخ الكائن المعايير.

ويمكنك أيضا تعيين الإسقاط على طريقة getlist الخاص بك.

وWoops لم أتبين كنت في اشارة الى السبات جافا. على أي حال، هذا http://forum.hibernate.org/viewtopic.php؟t=939039

ومنتدى آخر يجب أن تكون قادرا على الإجابة على سؤالك.

والقبيح لأنه قد يكون انتهى بي الأمر باستخدام خدعة التسلسل. أنا فقط تسلسل الكائن DetachedCriteria إلى صفيف بايت على بناء الكائن PaginatedList ودي تسلسل عند الحاجة. أوتش.

وشيء آخر يستحق المحاولة:

وتنفيذ DAO عام مثل واحد اقترح في الموقع السبات في وتمريرها إلى PaginatedList الاعتراض، جنبا إلى جنب مع كائن من القيود. إن الكائن PaginatedList ثم القيام شيء من هذا القبيل

Criteria.forClass(myDAO.getPersistentClass())
        .add(myRestrictions)
        .addOrder(<someOrder>)

و

Criteria.forClass(myDAO.getPersistentClass())
        .add(myRestrictions)
        .setProjection(Projections.rowCount());

ولم يحاكم ذلك حتى الآن، ولكن ينبغي لها أن تعمل.

public static DetachedCriteria Clone(this DetachedCriteria criteria)
{
   var dummy = criteria.ToByteArray();
   return dummy.FromByteArray<DetachedCriteria>();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top