La spécification d'une clause LIMIT dans un JPA2 référentiel @l'instruction de la Requête

StackOverflow https://stackoverflow.com//questions/25015612

  •  21-12-2019
  •  | 
  •  

Question

J'ai le texte suivant MySQL déclaration:

  "SELECT * FROM $this->tableName WHERE news_publication_id = '" + newsPublicationId + "' AND list_order > '" + listOrder +"' ORDER BY list_order LIMIT 1"

J'ai commencé sur la manipulation des données, le chemin d'accès en première effectuant une veille prolongée couche DAO.

Il avait les critères suivants, selon la méthode:

  @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();
  }

Et il fonctionne très bien.

Alors j'ai essayé de faire un JPA2 dépôt de la couche.

Il a maintenant la suivante JPQL méthode basée sur:

  @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);

Mais ça ne fonctionne pas.Parce que la LIMITE de la clause n'est pas valable.

Donc je me demande quoi faire.

Puis-je encore utiliser les critères de la méthode de ci-dessus dans ce JPA2 dépôt de la couche ?

Je voudrais éviter de faire confiance au client de transmettre la valeur limite et préfère coder en dur la valeur (1) dans ma couche.

Aussi, cette déclaration ne renvoie qu'un seul objet et donc, il n'y a pas de pagination nécessaire.

Tout conseil serait particulièrement bien accueillie.

Cordialement,

Stéphane Eybert

Était-ce utile?

La solution

Vous pouvez probablement ce avec un PageRequest. http://docs.spring.io/spring-data/jpa/docs/1.6.2.RELEASE/reference/html/repositories.html#repositories.core-concepts

Hibernate veut que vous fassiez setMaxResults() sur le Query objet, mais JPA n'a pas d'interface avec directement.

Autre option serait d'utiliser un @NamedNativeQuery

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top