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?
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.
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
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