ترتيب JPQL بواسطة جملة مع المعلمة
-
26-09-2019 - |
سؤال
أحاول كتابة استعلام JPQL بترتيب حسب الشر:
query = "SELECT c FROM item ORDER BY c.name ASC"
أرغب في تعيين معلمة "طلب" ، والتي ستكون قيمتها إما "ASC" أو "DESC":
query = "SELECT c FROM item ORDER BY c.name :order"
ثم في تنفيذي:
query.setParameter("order", "ASC");
هذا عندما أحصل على خطأ سبات:
org.hibernate.HibernateException: Errors in named queries
أي فكرة عما أفعله خطأ؟ شكرًا!
المحلول
لا يمكن أن يكون "ASC" أو "DESC" معلمة استعلام. يمكنك استخدام السلسلة السلسلة بدلاً من ذلك.
query = "SELECT c FROM item ORDER BY c.name " + sortOrder;
يجب عليك التحقق من صحة محتويات sortOrder
يمكن أن يكون ASC أو DESC فقط ولا يأتي مباشرة من المستخدم.
نصائح أخرى
إذا كنت ترغب في استخدام الاستعلامات المسماة هنا ، فستحتاج إلى اثنين منها (الاستعلامات المسماة ثابتة ولا يمكنك استخدام ASC و DESC كمعلمة كما أشار بواسطة Mark).
بدلاً من كتابة استعلام مسمى مرتين يحتوي على جملة "ترتيب بواسطة" ، يمكنك تنفيذ DAO بهذه الطريقة:
public List<MyEntity> findByAttribute(boolean desc,...){
TypedQuery<MyEntity> q = em.createNamedQuery(...
q.setParameter(...
List<MyEntity> result = q.getResultList();
if(desc){
Collections.reverse(result );
}
return result;
}
أفترض أن الطريقة الصحيحة هي استخدام ترتيب بند المعايير API
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Country> q = cb.createQuery(Country.class);
Root<Country> c = q.from(Country.class);
q.select(c);
q.orderBy(cb.asc(c.get("currency")), cb.desc(c.get("population")));
لا تنتمي إلى StackOverflow