Spring Data JPA - 获取列

时间:2017-03-06 06:43:45

标签: spring-data-jpa spring-data-rest

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

有没有办法使用Spring Data JPA?

3 个答案:

答案 0 :(得分:6)

这可以使用@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 :(得分:0)

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

select distinct

也许基于@RepositoryRestController

有一个类似但更优雅的变体

答案 2 :(得分:0)

Spring Data Rest也有类似的问题。

   File folder = new File("E:\\folder_to_LIST_OF_FILES");
            File[] listOfFiles = folder.listFiles();

            for (int i = 0; i < listOfFiles.length; i++) {
                if (listOfFiles[i].isFile()) {
                    FilesDto returnDto = new FilesDto();
                    returnDto.setFileName(FilenameUtils.removeExtension(listOfFiles[i].getName()));

                    // Check File Status if file is Locked or unlocked

                    if (lock==null) {
                        returnDto.setStatus("unlocked");
                        returnDto.setFilePath(listOfFiles[i].getAbsolutePath());

                    } else {
                        returnDto.setStatus("Locked");
                    }

                    returnDtoList.add(returnDto);
                }
            }

这两种方法都适用于spring-data,我可以在Spring Services中使用它, 但是通过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);

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

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

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

Spring-Boot 2.0.4。发布 弹簧数据:2.1.0.RC1 Spring-Data-Rest:3.1.0.RC1