52 votes

Sélectionner le premier résultat en utilisant JPA

J'ai besoin d'extraire de la base de données un seul résultat. Comment puis-je faire cela avec JPA ?

Select top 1 * from table

J'ai essayé

"sélectionner t de la table t"

query.setMaxResults(1);

query.getSingleResult();

mais ça n'a pas marché. D'autres idées ?

1 votes

Si vous ne spécifiez pas ORDER BY, vous obtenez un résultat arbitraire.

64voto

Jorge Points 6168

Essayez comme ceci

String sql = "SELECT t FROM table t";
Query query = em.createQuery(sql);
query.setFirstResult(firstPosition);
query.setMaxResults(numberOfRecords);
List result = query.getResultList();

Cela devrait fonctionner

MISE À JOUR*

Vous pouvez aussi essayer comme ceci

query.setMaxResults(1).getResultList();

0 votes

Je ne voulais pas faire query.getResultList().get(0) est-ce le seul moyen ?

0 votes

Pour récupérer un seul objet, vous pouvez essayer : Object object = query.setMaxResults(1).uniqueResult();

0 votes

UniqueResult() est spécifique à Hibernate, il n'est donc pas utilisable si l'on s'en tient à du JPA pur.

22voto

pinguinjesse Points 221

Pour utiliser getSingleResult sur un TypedQuery vous pouvez utiliser

query.setFirstResult(0);
query.setMaxResults(1);
result = query.getSingleResult();

5 votes

Est-il nécessaire d'utiliser setFirstResult(0) ?

1 votes

@Krystian Non, il n'y en a pas. En fait, j'obtiens une erreur. (J'utilise Amdatu)

8voto

Capybara Points 59

2021 att : vous pouvez utiliser TOP ou FIRST dans Spring Data JPA

exemple :

User findFirstByOrderByLastnameAsc();

User findTopByOrderByAgeDesc();

Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);

Slice<User> findTop3ByLastname(String lastname, Pageable pageable);

List<User> findFirst10ByLastname(String lastname, Sort sort);

List<User> findTop10ByLastname(String lastname, Pageable pageable);

doc : https://docs.spring.io/spring-data/jpa/docs/2.5.4/reference/html/#repositories.limit-query-result

6voto

Ayman Al-Absi Points 88

Le moyen le plus simple est d'utiliser @Query avec l'option NativeQuery comme ci-dessous :

@Query(value="SELECT 1 * FROM table ORDER BY anyField DESC LIMIT 1", nativeQuery = true)

27 votes

Ne répond pas à la question. Elle a été posée dans l'APP. Par exemple, cela ne fonctionnera pas avec Oracle

2 votes

Vous pouvez modifier la requête pour qu'elle corresponde à celle d'Oracle.

0 votes

Cela a fonctionné pour moi, car j'avais une requête très complexe et j'obtenais beaucoup de sélections de la première ligne. Dans JPA, je n'ai rien trouvé pour m'aider. J'utilisais db2 et les sélections avaient FETCH FIRST ROW ONLY.

2voto

Vineet Reynolds Points 40529

Utilisez une requête SQL native en spécifiant un fichier @NamedNativeQuery sur la classe d'entité, ou en utilisant l'annotation EntityManager.createNativeQuery méthode. Vous devrez spécifier le type du ResultSet à l'aide d'une classe appropriée, ou utiliser un mappage ResultSet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X