web-dev-qa-db-fra.com

Spring Data JPA - Obtenir toutes les valeurs uniques dans la colonne

J'ai un projet utilisant Spring Data JPA qui consomme les données d'une table remplie d'adresses. Une des colonnes de ce tableau est la ville. J'aimerais obtenir une liste distincte des villes figurant dans le tableau, à savoir SELECT DISTINCT city FROM address.

Existe-t-il un moyen de faire cela en utilisant Spring Data JPA?

5
Samantha Catania

Ceci peut être réalisé en utilisant une annotation @Query en tant que:

public interface AddressRepository extends CrudRepository<Address, Long> {
  @Query("SELECT DISTINCT a.city FROM Address a")
  List<String> findDistinctCity();
}

Ensuite, un appel à addressRepository.findDistinctCity() renverrait les noms de ville distincts.

Un exemple d'application est disponible sur Github pour examen. Exécutez le test d'intégration en tant que mvn clean test pour vérifier l'approche.

4
manish

Le commentaire de Manish devrait probablement être remplacé par une réponse (que je vais essayer de saisir ici car cela a finalement résolu mon problème ... bien que les projections ne semblaient pas fonctionner avec select distinct). La réponse sélectionnée fonctionne dans spring-data-jpa, mais échoue dans spring-data-rest. Une solution de contournement possible pour le scénario printemps-données-repos consiste à créer un @RestController séparé pour les résultats select distinct

@RestController
public class AddressRepoAdditionals {
     @Autowired
     private AddressRepository repo;

     @RequestMapping("/additional/address/distictCities")
     public List<String> findDistinctCity() {
          return repo.findDistinctCity();
     }
 }

il existe peut-être une variante similaire mais plus élégante basée sur @RepositoryRestController

0
jamey graham

J'ai un problème similaire avec Spring Data Rest. 

public interface ProjectReportRepository extends JpaRepository<ProjectReport, Long>{

ProjectReport findByProjectAndPeriod(Project project, ReportingPeriod period);
/**
 * 
 * @param project
 * @return
 */
@Query("SELECT "
        + " new api.model.reports.ProjectTimeAggregation("
        + " count(*) "
        + ") "
        + "FROM ProjectReport r "
        + "WHERE r.project = :project "
        + "")
ProjectTimeAggregation aggregateTimeInfo(Project project);

@Query("SELECT "
        + " new api.model.reports.ProjectTimeAggregation("
        + " count(*) "
        + ") "
        + "FROM ProjectReport r "
        + "WHERE r.project = :project "
        + " group by r.timeRag")
List<ProjectTimeAggregation> aggregateTimeInfoGroup(Project project);

Les deux méthodes fonctionnent avec les données de printemps et je peux les utiliser dans les services de printemps, , Mais via REST noeud final, seule la première méthode fonctionne: 

http://localhost:8080/api/projectreports/search/aggregateTimeInfo?project=/api/projects/6

La 2ème méthode renvoie une erreur de mappage:

"Couldn't find PersistentEntity for type class ProjectTimeAggregation!"

Cela fonctionne avec un objet POJO mais pas si l'objet est dans une collection. S'agit-il d'un bogue dans spring-data-rest, qui fonctionne avec des objets mais pas avec des collections?.

Spring-Boot 2.0.4.Release Spring-Data: 2.1.0.RC1 Spring-Data-Rest: 3.1.0.RC1

0
J3ernhard