Spring Data JPA - 获取列中的所有唯一值

问题描述 投票:5回答:3

我有一个使用Spring Data JPA的项目,它使用来自满地址表的数据。这张桌子的一个栏目是城市。我想得到一个明显的表中的城市列表,即SELECT DISTINCT city FROM address

有没有办法使用Spring Data JPA执行此操作?

spring-data-jpa spring-data-rest
3个回答
7
投票

这可以使用@Query注释实现:

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

然后,拨打addressRepository.findDistinctCity()将返回不同的城市名称。

Github上提供了一个示例应用程序供审阅。以mvn clean test运行集成测试以验证方法。


1
投票

Manish的评论可能应该被提到一个答案(我将尝试在这里捕捉,因为它最终解决了我的问题......虽然预测似乎不适用于select distinct)。所选答案适用于spring-data-jpa,但在spring-data-rest中失败。 spring-data-rest场景的一个可能的解决方法是为@RestController结果创建一个单独的select distinct

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

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

也许基于@RepositoryRestController有一个类似但更优雅的变化


0
投票

我有一个与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);

这两种方法都适用于spring-data,我可以在Spring Services中使用它,但是通过REST端点只有第一种方法可以工作:

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

第二种方法返回映射错误:

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

它适用于POJO对象,但如果对象位于集合中则不适用。这是spring-data-rest中的一个错误,它适用于对象但不适用于集合。

Spring-Boot 2.0.4。释放Spring-Data:2.1.0.RC1 Spring-Data-Rest:3.1.0.RC1

© www.soinside.com 2019 - 2024. All rights reserved.