La spécification d'une clause LIMIT dans un JPA2 référentiel @l'instruction de la Requête
-
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
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