【问题标题】:Spring Data JPA - Get All Unique Values in ColumnSpring Data JPA - 获取列中的所有唯一值
【发布时间】:2017-07-25 22:32:46
【问题描述】:

我有一个使用 Spring Data JPA 的项目,该项目使用满是地址的表中的数据。此表的列之一是城市。我想获得表格中的不同城市列表,即SELECT DISTINCT city FROM address

有没有办法使用 Spring Data JPA 做到这一点?

【问题讨论】:

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


    【解决方案1】:

    这可以使用@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 身份运行集成测试以验证该方法。

    【讨论】:

    • 我试过了,调用方法返回如下错误:java.lang.IllegalArgumentException: PersistentEntity must not be null!。请问有什么想法吗?
    • 您检查过示例应用程序吗?如果问题仍然存在,请发布完整代码以重现错误。
    • 我做了一些进一步的测试,似乎问题存在于 Spring Data Rest 部分,当直接从代码调用时它工作正常。谢谢!
    • Spring Data REST 存储库方法默认只能返回实体。但是,您可以编写一个投影来返回特定属性值,例如您的示例。官方文档详细介绍了这些案例。
    • 还值得一提的是,这里的查询应该包含映射名称而不是数据库名称。因此,例如,如果数据库表名是 city_name,那么查询将包含映射名称,即 CityName 列名也是如此
    【解决方案2】:

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

    @RestController
    public class AddressRepoAdditionals {
         @Autowired
         private AddressRepository repo;
    
         @RequestMapping("/additional/address/distictCities")
         public List<String> findDistinctCity() {
              return repo.findDistinctCity();
         }
     }
    

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

    【讨论】:

    • 这真的是spring-data-rest的蹩脚!但这甚至适用于 List 返回值。谢谢
    猜你喜欢
    • 2021-06-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 2017-08-06
    • 2019-10-03
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多