سؤال

أحاول كتابة استعلام 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")));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top