web-dev-qa-db-fra.com

Extraction du premier/dernier élément uniquement à l'aide de l'annotation Spring Data JPA et @Query

EDIT: Des solutions à ce problème sont fournies dans les deuxième et quatrième réponses concernant cette question setMaxResults for Spring-Data-JPA?

Goal: Récupérez le plus petit/grand élément par propriété z à l'aide d'un référentiel JPA Spring Data et de l'annotation Spring Query.

Ce que j'ai jusqu'à présent

@Query("SELECT xelement FROM x xelement ORDER BY xelement.z")
public List<X> findFirstElement();

Problème: Cette requête va chercher tous les éléments (ce qui n’est pas vraiment efficace). Si je voulais utiliser EntityManager directement, je pourrais définir le nombre de résultats en utilisant 

entityManager.setMaxResults(1)

pour obtenir uniquement le premier élément.

Question: Comment spécifier le nombre maximal de résultats à l'aide de l'annotation @Query?

Idée: Est-il préférable d'utiliser un PageRequest de taille 0?

Contraintes: Je suis conscient de la fonction de requête "FindFirstBy ...." mais je veux/dois utiliser l'annotation @Query.

17
Ueli Hofstetter

Vous pouvez utiliser la propriété limit de SQL simplement en ajoutant nativeQuery à l'annotation @Query. Cependant, il existe un autre moyen plus efficace de procéder. Une classe paginable dans votre méthode de référentiel résoudra votre problème sans toucher votre annotation @Query

@Query(value = "SELECT xelement FROM x xelement ORDER BY xelement.z")
List<X> findFirstElement(Pageable limit);

Pour définir la limite et le décalage, use devrait appeler cette méthode de référentiel comme suit:

List<X> xValues = xRepository.findFirstElement(new PageRequest(0, 1));

Ici, 1 correspond à la limite que vous souhaitez.

8
ahmetcetin

La syntaxe de requête JPA la plus proche que je puisse penser pour votre cas d'utilisation est findFirstByZIsNotNullOrderByZAsc. Cela devrait éliminer le besoin d'écrire une requête native personnalisée.

1
comiventor

Essayez de faire ceci:

@Query(value = "SELECT xelement FROM x xelement ORDER BY xelement.z  LIMIT 1",
       nativeQuery = true)
0
fjgarzon