我想编写一个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> {
}
答案 0 :(得分:4)
对于CrudRepository,您将需要使用lambda表达式才能返回列表
public List<Student> findAll() {
List<Student> students = new ArrayList<>();
studentRepository.findAll().forEach(students::add);
return students;
}
答案 1 :(得分:1)
两个选项:
实例化服务方法中可迭代的列表,并像在Convert Iterator to ArrayList
覆盖默认的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> {
}
参考:
答案 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());