الطلب من خلال أعمدة متفاوتة في JPQL/Hibernate
سؤال
لدي جدول الجلسات. تحتوي كل جلسة على "Session_start_time" و "session_end_time". في حين أن الجلسة مفتوحة ، فإن وقت النهاية فارغ. أريد أن أحضر قائمة الجلسات ، وأطلبها بالمنطق التالي:
- إذا كانت الجلسة مفتوحة (لا يوجد وقت نهاية) ، فاطلبها بحلول وقت البدء.
- إذا تم إغلاق الجلسة ، فاطلبها بحلول وقت الانتهاء.
شيء مثل:
ORDER BY (session_end_time == null) ? session_start_time : session_end_time
أنا أستخدم JPA و JPQL للاستعلامات ، واستخدام Hibernate للتنفيذ. ماذا تنصح؟
ملاحظة: أفضل عدم إضافة حالة إلى SELECT ، ولكن بدلاً من ذلك أبقيها نظيفة حتى أحصل على قائمة بالجلسات دون حقول إضافية غير ضرورية.
المحلول
اطلب بواسطة NVL (session_end_time ، session_start_time)
NVL هي وظيفة أوراكل. أنا متأكد من أن هناك وظائف مثل تلك الخاصة بـ DBMs الأخرى
وجدت هذا واحد من أجل السبات: NVL في السبات: كيفية محاكاة NVL في HQL
ترتيب حسب: https://forum.hibernate.org/viewtopic.php؟f=25&t=997220&start=0
نصائح أخرى
يفعل
ORDER BY CASE
WHEN session_end_time IS NULL THEN session_start_time
ELSE session_end_time
END
العمل في DBMS الخاص بك؟ هذا لا يضيف حقل.
وإلا يمكنك حسابه داخل استعلام متداخل ، ولكن لا تدرجه في النهائي SELECT
بند:
SELECT field1, field2 FROM (
SELECT field1, field2, CASE WHEN session_end_time... END AS dummyfield
) Q
ORDER BY Q.dummyfield