تنفيذ نتيجة الترحيل في السبات (الحصول على عدد من الصفوف)
سؤال
وكيف يمكنني تنفيذ الترحيل في حالة السبات؟ و 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.
وأنا شخصيا أعتقد يجب التعامل مع الترحيل في الواجهة الأمامية. أعرف أن هذا ليس من كفاءة ولكن على الأقل سيكون أقل عرضة للخطأ.
إذا كنت تستخدم العد (*) شيء ما يمكن أن يحدث إذا الحصول على حذف السجلات من الجدول في بين طلبات للحصول على صفحة معينة؟ الكثير من الأشياء يمكن أن تذهب الخطأ بهذه الطريقة.