تنفيذ نتيجة الترحيل في السبات (الحصول على عدد من الصفوف)

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

سؤال

وكيف يمكنني تنفيذ الترحيل في حالة السبات؟ و Query الأجسام لديها أساليب يسمى <لأ href = " https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Query.html#setMaxResults(int) "يختلط =" noreferrer "> setMaxResults و <لأ href =" HTTPS: // www.hibernate.org/hib_docs/v3/api/org/hibernate/Query.html#setFirstResult(int) "يختلط =" noreferrer "> setFirstResult التي هي مفيدة بالتأكيد. ولكن أين يمكنني الحصول على عدد من النتائج، لدرجة أنني يمكن أن تظهر وصلة إلى الصفحة الأخيرة من النتائج، والأشياء المطبوعة مثل النتائج 200-250 من الثلاثون

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

المحلول

ويمكنك استخدام Query.setMaxResults (كثافة النتائج) وQuery.setFirstResult (الباحث الإزاحة).

والتحرير أيضا: ليس هناك طريقة لمعرفة عدد النتائج التي ستحصل عليه. لذلك، يجب عليك أولا الاستعلام مع "العد حدد (*) ...". قليلا القبيح، IMHO.

نصائح أخرى

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

Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult();

وللاستعلامات Criteria وعادة ما دفع البيانات الخاصة بي إلى DTO مثل هذا

ScrollableResults scrollable = criteria.scroll(ScrollMode.SCROLL_INSENSITIVE);
if(scrollable.last()){//returns true if there is a resultset
    genericDTO.setTotalCount(scrollable.getRowNumber() + 1);
    criteria.setFirstResult(command.getStart())
            .setMaxResults(command.getLimit());
    genericDTO.setLineItems(Collections.unmodifiableList(criteria.list()));
}
scrollable.close();
return genericDTO;

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

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

لتجنب ذلك إذا كنت تريد حقا أن انتقل من خلال النتائج، فمن الأفضل لاستخدام ScrollableResults. لا رمي هذا الكائن بعيدا بين الترحيل، ولكن استخدامها للحفاظ على السجلات في نفس الترتيب. لمعرفة عدد السجلات من ScrollableResults، يمكنك ببساطة الانتقال إلى موقف آخر ()، ومن ثم الحصول على رقم الصف. تذكر أن تضيف 1 إلى هذه القيمة، لأن أرقام الصفوف تبدأ العد عند 0.

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

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

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