سؤال

لدي بيان 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top