Spring-Data JPA CrudRepository返回Iterable,将它转换为List是否可以?

Jam*_*ler 26 java spring spring-data spring-data-jpa spring-boot

我正在编写一个代码生成工具来使用Spring-Data-Jpa为Spring启动应用程序生成后端连接代码,而且我很温和地告诉我CrudRepository中的方法返回Iterable而不是List,因为iterable不能提供足够的功能,但List,所以我正在寻找将iterable转换为列表的最佳方法.

我看到这篇关于将迭代更改为集合的帖子我想知道,为什么不将它转换为List,而不是使用像Guava这样的库或实现我自己的函数来进行转换?这样做我不知道有什么问题吗?

编辑:我问,因为它是一个代码生成工具,使它生成引入第三方库依赖的代码是不合理的,编写我自己的函数来进行转换也不合理,因为它必须住在某个地方而且我宁愿在生成的代码中没有它.一个简单的演员会有用,如果有点难看,但只是想知道是否有我遗失的东西?

Rob*_*roj 83

你提到过[spring-data-jpa],我猜你使用JPA.在这种情况下,使用JpaRepository而不是像你想要的那样CrudRepository返回方法List.

  • 凉.我现在只看一下文档.JpaRepository扩展了PagingAndSortingRepository,它扩展了扩展Repository的CrudRepository.所以它有点建立在其他人的基础上.整齐.是的,我认为最干净的解决方案是切换到JpaRepository. (7认同)
  • 这不幸的是总是不起作用. - >例如,当你使用`PagingAndSortingRepository`时,它继承自`CrudRepository`. (2认同)

And*_*son 35

不,我认为没关系.

虽然a List保证是Iterable一个Iterable可能不是一个List.这意味着如果你转换Iterable为a,List它可能会在运行时失败.即使它有效,也不能保证它将来会继续工作,因为它可能会在新版本的Spring Data JPA中发生变化,而不会破坏接口的合同.

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


Big*_*iga 19

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

@Repository
public interface DataRepository extends CrudRepository<Data, Long> {

    @Override
    List<Data> findAll();

}
Run Code Online (Sandbox Code Playgroud)

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

@NoRepositoryBean
public interface GenericRepository<T> extends CrudRepository<T, Long> {

    @Override
    List<T> findAll();

}
Run Code Online (Sandbox Code Playgroud)

  • Hi Shade...Spring Data 知道如何实现这一点。我们使用方法声明解释要做什么,Spring Data 执行实现。例如,像带有过滤器的查询方法一样。请参阅https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods (2认同)

Rob*_*roj 5

从 Spring Data 3 开始,还有另一个选项:ListCrudRepository.

这篇博文介绍了为什么CrudRepository选择Iterable而不是List.

https://spring.io/blog/2022/02/22/announcing-listcrudrepository-friends-for-spring-data-3-0