web-dev-qa-db-ja.com

Spring Data JPA-列のすべての一意の値を取得する

Spring Data JPAを使用して、アドレスでいっぱいのテーブルのデータを使用するプロジェクトがあります。このテーブルの列の1つは都市です。テーブルにある都市の明確なリストを取得したい、つまりSELECT DISTINCT city FROM address

Spring Data JPAを使用してこれを行う方法はありますか?

8

これは、次のように_@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_として統合テストを実行し、アプローチを確認します。

7
manish

Manishのコメントはおそらく答えにぶつかるはずです(これは私の問題を最終的に解決したので、ここでキャプチャしようとします...ただし、予測はselect distinctでは機能しないようです)。選択した回答は、spring-data-jpaでは機能しますが、spring-data-restでは機能しません。 spring-data-restシナリオの考えられる回避策の1つは、@RestControllerの結果に対して個別のselect distinctを作成することです。

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

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

おそらく、@ RepositoryRestControllerに基づいて、似ているがよりエレガントなバリエーションがある

1
jamey graham

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

2番目のメソッドはマッピングエラーを返します。

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

POJOオブジェクトで機能しますが、オブジェクトがコレクション内にある場合は機能しません。これはspring-data-restのバグですか?それはオブジェクトでは機能しますが、コレクションでは機能しません。

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

0
J3ernhard