web-dev-qa-db-fra.com

Comment utiliser OrderBy avec findAll in Spring Data

J'utilise des données de printemps et mon DAO ressemble à

public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public findAllOrderByIdAsc();   // I want to use some thing like this
}

Dans le code ci-dessus, la ligne commentée montre mon intention. Spring Data peut-il fournir une fonctionnalité intégréeutiliser une telle méthode pour rechercher tous les enregistrements par ordre de colonne avec ASC/DESC?

185
Prashant Shilimkar
public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public List<StudentEntity> findAllByOrderByIdAsc();
}

Le code ci-dessus devrait fonctionner. J'utilise quelque chose de similaire:

public List<Pilot> findTop10ByOrderByLevelDesc();

Il retourne 10 lignes avec le plus haut niveau.

IMPORTANT: Depuis qu'on m'a dit qu'il était facile de rater le point essentiel de cette réponse, voici une petite précision:

findAllByOrderByIdAsc(); // don't miss "by"
       ^
451
Sikor

Si je comprends bien, je ne pense pas que ce soit possible avec une requête de nommage de méthode directe. Vous pouvez cependant utiliser le mécanisme de tri intégré, en utilisant la classe Sort . Le référentiel a une méthode findAll(Sort) à laquelle vous pouvez transmettre une instance de Sort. Par exemple:

import org.springframework.data.domain.Sort;

@Repository
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentDAO studentDao;

    @Override
    public List<Student> findAll() {
        return studentDao.findAll(sortByIdAsc());
    }

    private Sort sortByIdAsc() {
        return new Sort(Sort.Direction.ASC, "id");
    }
} 
45
Paul Samsotha

S'il vous plaît jeter un oeil ici: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods

Sous la section: "Tableau 2.3. Mots clés pris en charge dans les noms de méthodes"

Je pense qu'il a exactement ce dont vous avez besoin et que la même requête que vous avez indiquée devrait fonctionner ...

9
shlomi33

Oui, vous pouvez trier à l'aide d'une méthode d'interrogation dans Spring Data.

Ex: ordre croissant ou décroissant en utilisant la valeur du champ id.

Code:

  public interface StudentDAO extends JpaRepository<StudentEntity, Integer> {
    public findAllByOrderByIdAsc();   
}

solution alternative:

    @Repository
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentDAO studentDao;

    @Override
    public List<Student> findAll() {
        return studentDao.findAll(orderByIdAsc());
    }
private Sort orderByIdAsc() {
    return new Sort(Sort.Direction.ASC, "id")
                .and(new Sort(Sort.Direction.ASC, "name"));
}
}

Spring Data Tri: Tri

2
Narayan Yerrabachu

J'essaie dans cet exemple de vous montrer un exemple complet pour personnaliser vos tris OrderBy

 import Java.util.List;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.*;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 import org.springframework.data.domain.Sort;
 /**
 * Spring Data  repository for the User entity.
 */
 @SuppressWarnings("unused")
 @Repository
 public interface UserRepository extends JpaRepository<User, Long> {
 List <User> findAllWithCustomOrderBy(Sort sort);
 }

vous utiliserez cet exemple: Une méthode pour construire dynamiquement un objet qui instance de Sort: 

import org.springframework.data.domain.Sort;
public class SampleOrderBySpring{
 Sort dynamicOrderBySort = createSort();
     public static void main( String[] args )
     {
       System.out.println("default sort \"firstName\",\"name\",\"age\",\"size\" ");
       Sort defaultSort = createStaticSort();
       System.out.println(userRepository.findAllWithCustomOrderBy(defaultSort ));


       String[] orderBySortedArray = {"name", "firstName"};
       System.out.println("default sort ,\"name\",\"firstName\" ");
       Sort dynamicSort = createDynamicSort(orderBySortedArray );
       System.out.println(userRepository.findAllWithCustomOrderBy(dynamicSort ));
      }
      public Sort createDynamicSort(String[] arrayOrdre) {
        return  Sort.by(arrayOrdre);
        }

   public Sort createStaticSort() {
        String[] arrayOrdre  ={"firstName","name","age","size");
        return  Sort.by(arrayOrdre);
        }
}
0
S. FRAJ