Spring Data JPAを使用して、アドレスでいっぱいのテーブルのデータを使用するプロジェクトがあります。このテーブルの列の1つは都市です。テーブルにある都市の明確なリストを取得したい、つまりSELECT DISTINCT city FROM address
。
Spring Data JPAを使用してこれを行う方法はありますか?
これは、次のように_@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
_として統合テストを実行し、アプローチを確認します。
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に基づいて、似ているがよりエレガントなバリエーションがある
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