我有一个使用Spring Data JPA的项目,它使用来自满地址表的数据。这张桌子的一个栏目是城市。我想得到一个明显的表中的城市列表,即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场景的一个可能的解决方法是为@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
第二种方法返回映射错误:
"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