Specifica di una clausola limite in una dichiarazione di repository JPA2 @Query
-
21-12-2019 - |
Domanda
Ho la seguente dichiarazione MySQL:
"SELECT * FROM $this->tableName WHERE news_publication_id = '" + newsPublicationId + "' AND list_order > '" + listOrder +"' ORDER BY list_order LIMIT 1"
.
Ho iniziato sul percorso di gestione dei dati facendo prima un strato DAO Ibernate.
Aveva il seguente metodo basato sui criteri:
@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();
}
.
E funziona bene.
Poi ho provato a fare un livello di repository JPA2.
Ora ha il seguente metodo basato su 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);
.
Ma non funziona.Poiché la clausola limite non è valida.
Quindi mi chiedo cosa fare.
Posso ancora utilizzare il metodo basato su criteri di cui sopra in questo livello di repository JPA2?
Vorrei evitare di fidarmi del client per passare il valore limite e preferire il codice rigido tale valore (di 1) nel mio livello.
Inoltre, questa affermazione restituisce un solo oggetto e quindi non c'è nessuna paginazione necessaria.
Qualsiasi suggerimento sarebbe il più accolto.
Cordiali saluti,
Stephane Eybert
Soluzione
Puoi probabilmente questo con un PageRequest
. http://docs.spring.io/spring-data/jpa/docs/1.6.2.release/reference/html/repositorys.html#repository.core-concepts
Ibernazione vuole che tu faccia setMaxResults()
sull'oggetto Query
, ma JPA non si interfaccia con questo direttamente.
L'altra opzione sarebbe quella di utilizzare un @NamedNativeQuery