web-dev-qa-db-fra.com

Quelle est l'alternative de la clause LIMIT en JPQL?

Je travaille avec une requête PostgreSQL implémentant en JPQL.

Ceci est un exemple de requête native psql qui fonctionne bien,

SELECT * FROM students ORDER BY id DESC LIMIT 1;

La même requête dans JPQL ne fonctionne pas,

@Query("SELECT s FROM Students s ORDER BY s.id DESC LIMIT 1")

Students getLastStudentDetails();

semble que la clause LIMIT ne fonctionne pas en JPQL.

Selon la documentation JPA, nous pouvons utiliser setMaxResults/setFirstResult. Quelqu'un peut-il me dire comment puis-je l'utiliser dans ma requête ci-dessus?

20
Madhu

Vous utilisez JPQL qui ne prend pas en charge la limitation des résultats. Lorsque vous utilisez JPQL natif, vous devez utiliser setMaxResults pour limiter les résultats.

Cependant, vous utilisez Spring Data JPA, ce qui le rend très facile à faire. Voir ici dans le guide de référence pour savoir comment limiter les résultats en fonction d'une requête. Dans votre cas, la méthode suivante, find ferait exactement ce que vous voulez. 

findFirstByOrderById();

Vous pouvez également utiliser un argument Pageable avec votre requête au lieu d'une clause LIMIT.

@Query("SELECT s FROM Students s ORDER BY s.id DESC")
List<Students> getLastStudentDetails(Pageable pageable);

Ensuite, dans votre code d'appel, faites quelque chose comme ceci (comme expliqué ici dans le guide de référence). 

getLastStudentDetails(new PageRequest(0,1));

Les deux devraient donner le même résultat, sans avoir besoin de recourir à du SQL simple. 

27
M. Deinum

Comme indiqué dans les commentaires, JPQL ne prend pas en charge le mot clé LIMIT.

Vous pouvez y parvenir en utilisant la variable setMaxResults, mais si ce que vous voulez n'est qu'un seul élément, utilisez la variable getSingleResult. Une exception est levée si aucun élément n'est trouvé.

Donc, votre requête serait quelque chose comme:

TypedQuery<Student> query = entityManager.createQuery("SELECT s FROM Students s ORDER BY s.id DESC", Student.class);    
query.setMaxResults(1);

Si vous souhaitez définir un décalage de départ spécifique, utilisez query.setFirstResult(initPosition); aussi

9
dazito

Vous pouvez utiliser quelque chose comme ceci:

 @Repository
 public interface ICustomerMasterRepository extends CrudRepository<CustomerMaster, String> 
 {
    @Query(value = "SELECT max(c.customer_id) FROM CustomerMaster c ")
    public String getMaxId();
 }
1
Rajib Das Gupta

Bonjour pour récupérer une seule ligne et utiliser LIMIT dans jpql, nous pouvons dire au jpql s'il s'agit d'une requête native.

(using - nativeQuery = true)  

Ci-dessous est l'utilisation

@Query("SELECT s FROM Students s ORDER BY s.id DESC LIMIT 1", nativeQuery=true)
Students getLastStudentDetails();
0
Manish Joshi