如何在CrudRepository上使用findAll()返回列表而不是Iterable

时间:2019-06-07 18:27:09

标签: java spring spring-boot spring-mvc

我想编写一个FindAll()方法,该方法返回所有Student对象的列表。但是CRUDRepository仅具有Iterable <> findAll()。

目标是让所有学生进入列表,然后将其传递给API控制器,这样我就可以为所有学生提供http GET。

将此方法转换为List <> FindAll()

的最佳方法是什么

在我当前的代码中,StudentService中的findAll方法为我提供了发现的不兼容类型:可迭代。必需:列表错误。

服务

@Service
@RequiredArgsConstructor
public class StudentServiceImpl implements StudentService {

    @Autowired
    private final StudentRepository studentRepository;

    //Incompatible types found: Iterable. Required: List
    public List<Student> findAll() {
        return studentRepository.findAll();
    }
}

API控制器

@RestController
@RequestMapping("/api/v1/students")

public class StudentAPIController {

    private final StudentRepository studentRepository;

    public StudentAPIController(StudentRepository studentRepository) {
        this.studentRepository = studentRepository;
    }

    @GetMapping
    public ResponseEntity<List<Student>> findAll() {
        return ResponseEntity.ok(StudentServiceImpl.findAll());
    }
}

StudentRepository

public interface StudentRepository extends CrudRepository<Student, Long> {

}

9 个答案:

答案 0 :(得分:4)

对于CrudRepository,您将需要使用lambda表达式才能返回列表

public List<Student> findAll() {
    List<Student> students = new ArrayList<>();
    studentRepository.findAll().forEach(students::add);
    return students;
}

答案 1 :(得分:1)

两个选项:

  1. 实例化服务方法中可迭代的列表,并像在Convert Iterator to ArrayList

  2. 中那样返回
  3. 覆盖默认的spring数据findAll()方法以返回列表-请参见https://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html#repositories.custom-implementations

如果有很多服务将返回列表,那么我建议您使用第二种方法来设置您,以便在必须执行几次操作后才能提取逻辑。

答案 2 :(得分:0)

我认为您可以在List<Student> findAll()界面中简单地定义一个抽象方法StudentRepository

答案 3 :(得分:0)

如果使StudentRepository从JpaRepository继承,则可以通过返回列表来使用findAll()方法。

public interface StudentRepository extends JpaRepository<Student, Long> {

}

参考:

https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html#findAll--

答案 4 :(得分:0)

default List<Student> getStudentList() {
    final List<Student> studentList = new LinkedList<>();

    Iterable<Student> iterable = findAll();
    iterable.forEach(studentList::add);

    return studentList;
}

答案 5 :(得分:0)

对于尚未使用过lambda表达式但仍希望看到有效解决方案的人来说,这是一种旧方法:

public List<Student> findAllStudents() {
    Iterable<Student> findAllIterable = studentRepository.findAll();
    return mapToList(findAllIterable);
}

private List<Employee> mapToList(Iterable<Employee> iterable) {
    List<Student> listOfStudents = new ArrayList<>();
    for (Student student : iterable) {
        listOfStudents.add(student);
    }
    return listOfStudents;
}

答案 6 :(得分:0)

有一个更简单的方法:

List<Student> studentsList;     
studentsList = (List<Student>) studentRepository.findAll();

答案 7 :(得分:0)

CrudRepository 中添加:

public interface StudentRepository extends CrudRepository<Student, Long> {
    List<Student> findAll();
}

答案 8 :(得分:0)

聚会迟到了,但这是我通常这样做的方式(使用流/收集)。这里假设 CRUD 存储库为 DingDong

List<DingDong> dingdongs = StreamSupport //
    .stream(repository.findAll().spliterator(), false) //
    .collect(Collectors.toList());