تحديد جملة LIMIT في بيان @Query لمستودع JPA2
-
21-12-2019 - |
سؤال
لدي بيان MySQL التالي:
"SELECT * FROM $this->tableName WHERE news_publication_id = '" + newsPublicationId + "' AND list_order > '" + listOrder +"' ORDER BY list_order LIMIT 1"
لقد بدأت في مسار معالجة البيانات عن طريق إجراء طبقة Hibernate DAO أولاً.
كان لديه الطريقة القائمة على المعايير التالية:
@Override
public NewsHeading findNextWithListOrder(NewsPublication newsPublication, int listOrder) {
Criteria criteria = getSession().createCriteria(getPersistentClass());
criteria.add(Restrictions.eq("newsPublication", newsPublication));
criteria.add(Restrictions.gt("listOrder", listOrder)).addOrder(Order.asc("listOrder")).setMaxResults(1);
return (NewsHeading) criteria.uniqueResult();
}
ويعمل على ما يرام.
ثم حاولت عمل طبقة مستودع JPA2.
أصبح لديه الآن الطريقة التالية المستندة إلى JPQL:
@Query("SELECT nh FROM NewsHeading nh WHERE nh.newsPublication = :newsPublication AND nh.listOrder > :listOrder ORDER BY nh.listOrder ASC LIMIT 1")
public NewsHeading findByNextListOrder(@Param("newsPublication") NewsPublication newsPublication, @Param("listOrder") int listOrder);
لكنها لا تعمل.لأن جملة LIMIT غير صالحة.
لذلك أتساءل ماذا أفعل.
هل لا يزال بإمكاني استخدام الطريقة القائمة على المعايير المذكورة أعلاه في طبقة مستودع JPA2 هذه؟
أرغب في تجنب الوثوق بالعميل لتمرير القيمة الحدية وأفضل ترميز تلك القيمة (1) في طبقتي.
كما أن هذا البيان يُرجع كائنًا واحدًا فقط، وبالتالي ليست هناك حاجة إلى ترقيم الصفحات.
سيكون أي نصيحة موضع ترحيب كبير.
أطيب التحيات،
ستيفان ايبرت
المحلول
ربما يمكنك هذا مع أ PageRequest
. http://docs.spring.io/spring-data/jpa/docs/1.6.2.RELEASE/reference/html/repositories.html#repositories.core-concepts
السبات يريد منك أن تفعل setMaxResults()
على ال Query
كائن، ولكن JPA لا يتفاعل مع ذلك مباشرة.
سيكون الخيار الآخر هو استخدام أ @NamedNativeQuery