【问题标题】:Spring-Data JPA CrudRepository returns Iterable, is it OK to cast this to List?Spring-Data JPA CrudRepository 返回 Iterable,可以将其转换为 List 吗?
【发布时间】:2016-04-14 14:58:13
【问题描述】:

我正在编写一个代码生成工具来使用 Spring-Data-Jpa 为 Spring-boot 应用程序生成后端接线代码,我有点恼火的是,CrudRepository 中的方法返回 Iterable 而不是 List,因为 iterable 没有提供了足够多的功能,但 List 确实如此,所以我正在寻找将可迭代对象转换为列表的最佳方法。

我看到this post 将可迭代对象更改为集合,我想知道,与其使用像 Guava 这样的库或实现我自己的函数来进行转换,为什么不直接将其转换为 List 呢?这样做有什么我不知道的问题吗?

编辑: 我问是因为因为它是一个代码生成工具,所以让它生成引入对 3rd 方库的依赖关系的代码是不合理的,并且编写我自己的函数来进行转换也是不合理的,因为它必须存在于某个地方,我'宁愿在生成的代码中没有那个。一个简单的演员表会起作用,如果有点难看,但只是想知道我是否遗漏了什么?

【问题讨论】:

    标签: java spring spring-boot spring-data spring-data-jpa


    【解决方案1】:

    不,我觉得不行。

    虽然List 保证是Iterable,但Iterable 可能不是List。这意味着如果您将Iterable 转换为List,它可能会在运行时失败。即使它有效,也不能保证它会在未来继续有效,因为它可能会在新版本的 Spring Data JPA 中发生变化而不会破坏接口的约定。

    您应该声明自己的返回 List 的查询方法,而不是使用强制转换。

    您也可以使用Streamable.of(iterable).toList() 进行转换。 This answer 还包含一些背景,为什么选择 Iterable 作为这些方法的返回类型。

    【讨论】:

      【解决方案2】:

      您的界面仍然可以扩展 CrudRepository,您只需添加一个新方法 findAll 返回一个列表。比如下面的例子:

      @Repository
      public interface DataRepository extends CrudRepository<Data, Long> {
      
          @Override
          List<Data> findAll();
      
      }
      

      如果您有一个“抽象”存储库要由您的所有存储库扩展,您也可以添加此方法,因此它将对您的所有存储库生效。比如下面的例子:

      @NoRepositoryBean
      public interface GenericRepository<T> extends CrudRepository<T, Long> {
      
          @Override
          List<T> findAll();
      
      }
      

      【讨论】:

      【解决方案3】:

      您提到了[spring-data-jpa],所以我猜您使用的是 JPA。在这种情况下,使用JpaRepository 而不是CrudRepository,其中方法返回List,就像你想要的那样。

      【讨论】:

      • 酷。我现在只是看了一下文档。 JpaRepository 扩展了 PagingAndSortingRepository,后者扩展了 CrudRepository,后者扩展了 Repository。所以它有点建立在其他人的基础上。整洁的。是的,我认为最干净的解决方案是切换到 JpaRepository。
      • 不幸的是,这并不总是有效。 -> 例如,当您使用PagingAndSortingRepository 时,它继承自CrudRepository
      猜你喜欢
      • 2020-05-20
      • 2015-09-09
      • 2018-01-19
      • 1970-01-01
      • 2018-08-15
      • 2011-04-26
      • 2016-06-13
      • 2012-02-09
      相关资源
      最近更新 更多