关于java:Spring-Data JPA CrudRepository返回Iterable,可以将它转换为List吗?

Spring-Data JPA CrudRepository returns Iterable, is it OK to cast this to List?

我正在编写一个代码生成工具来使用Spring Data JPA为Spring引导应用程序生成后端接线代码,而Cruderpositive中的方法返回iterable而不是lis t(因为iterable没有提供足够的功能),这让我有点恼火,但list提供了足够的功能,因此我正在寻找将iterable转换为lis的最佳方法。T

我看到这篇关于将iterable改为collection的文章,我想知道,与其使用像guava这样的库或者实现我自己的函数来进行转换,为什么不直接将它转换为list呢?这样做有什么我不知道的地方吗?

编辑:我这样问是因为它是一个代码生成工具,不合理的做法是让它生成引入对第三方库依赖性的代码,并编写自己的函数来进行转换,这也不是真正合理的,因为它必须生活在某个地方,而我宁愿不在生成的代码中使用它。一个简单的演员会有用,如果有点难看,但只是想知道是否有什么东西我错过了?


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


不,我觉得不好。

List被保证是Iterable时,Iterable不能是List。这意味着,如果将Iterable强制转换为List,它可能会在运行时失败。即使它可以工作,也不能保证将来它会继续工作,因为它可以在不破坏接口合同的情况下在SpringDataJPA的新版本中进行更改。

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


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

1
2
3
4
5
6
7
@Repository
public interface DataRepository extends CrudRepository<Data, Long> {

    @Override
    List<Data> findAll();

}

如果您有一个"抽象"存储库要由所有存储库扩展,那么您也可以添加这个方法,这样它将对所有存储库都有影响。比如下面的例子:

1
2
3
4
5
6
7
@NoRepositoryBean
public interface GenericRepository<T> extends CrudRepository<T, Long> {

    @Override
    List<T> findAll();

}