CRUD 存储库 findById() 不同 return 值
CRUD Repository findById() different return value
在我的 SpringBoot 应用程序中,我使用的是 CrudRepo。
我发现 return 值有问题:Required != Found
GitHub: https://github.com/einhar/WebTaskManager/tree/findById-problem
无论将方法 return 类型从 Task 更改为 Object -> IDE 都停止显示错误,但由于稍后数据类型的验证可能会出现问题。
你知道怎么解决吗?有什么提示吗?
CrudRepo
public interface TaskRepository extends CrudRepository<Task, Integer> {}
服务
@Service
@Transactional
public class TaskService {
@Autowired
private final TaskRepository taskRepository;
public TaskService(TaskRepository taskRepository) {
this.taskRepository = taskRepository;
}
public List<Task> findAll() {
List<Task> tasks = new ArrayList<>();
for (Task task : taskRepository.findAll()) {
tasks.add(task);
}
return tasks; // Work properly :)
}
/* ... */
public Task findTask(Integer id) {
return taskRepository.findById(id); // Find:Task | Required: java.util.Optional :(
}
}
在您的 CrudRepo 中创建一个方法:
Task getById(Integer id);
然后在您的 TaskService 中调用此方法,您就可以开始了:)
findById方法是return可选的,所以你可以通过get()方法获取任务。您可以选择以下3种情况
当找不到任务时你会得到一个异常:
public Task findTask(Integer id) {
return taskRepository.findById(id).get();
}
找不到任务时,您将返回空值:
public Task findTask(Integer id) {
return taskRepository.findById(id).orElse(null);
}
找不到任务时,您将得到一个空的新任务:
public Task findTask(Integer id) {
return taskRepository.findById(id).orElse(new Task());
}
或者只是 return 可选对象
public Optional<Task> findTask(Integer id) {
return taskRepository.findById(id);
}
我认为不需要在 Repository bean 中创建 getById(... id) 方法 class 因为在 SimpleJPARepository 中已经实现了这样的方法。所以你可以直接调用这个方法。
请参阅官方 spring 文档:-
/*
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#findById(java.io.Serializable)
*/
public Optional<T> findById(ID id) {
Assert.notNull(id, ID_MUST_NOT_BE_NULL);
Class<T> domainType = getDomainClass();
if (metadata == null) {
return Optional.ofNullable(em.find(domainType, id));
}
LockModeType type = metadata.getLockModeType();
Map<String, Object> hints = getQueryHints().withFetchGraphs(em).asMap();
return Optional.ofNullable(type == null ? em.find(domainType, id, hints) : em.find(domainType, id, type, hints));
}
在我的 SpringBoot 应用程序中,我使用的是 CrudRepo。 我发现 return 值有问题:Required != Found
GitHub: https://github.com/einhar/WebTaskManager/tree/findById-problem
无论将方法 return 类型从 Task 更改为 Object -> IDE 都停止显示错误,但由于稍后数据类型的验证可能会出现问题。
你知道怎么解决吗?有什么提示吗?
CrudRepo
public interface TaskRepository extends CrudRepository<Task, Integer> {}
服务
@Service
@Transactional
public class TaskService {
@Autowired
private final TaskRepository taskRepository;
public TaskService(TaskRepository taskRepository) {
this.taskRepository = taskRepository;
}
public List<Task> findAll() {
List<Task> tasks = new ArrayList<>();
for (Task task : taskRepository.findAll()) {
tasks.add(task);
}
return tasks; // Work properly :)
}
/* ... */
public Task findTask(Integer id) {
return taskRepository.findById(id); // Find:Task | Required: java.util.Optional :(
}
}
在您的 CrudRepo 中创建一个方法:
Task getById(Integer id);
然后在您的 TaskService 中调用此方法,您就可以开始了:)
findById方法是return可选的,所以你可以通过get()方法获取任务。您可以选择以下3种情况 当找不到任务时你会得到一个异常:
public Task findTask(Integer id) {
return taskRepository.findById(id).get();
}
找不到任务时,您将返回空值:
public Task findTask(Integer id) {
return taskRepository.findById(id).orElse(null);
}
找不到任务时,您将得到一个空的新任务:
public Task findTask(Integer id) {
return taskRepository.findById(id).orElse(new Task());
}
或者只是 return 可选对象
public Optional<Task> findTask(Integer id) {
return taskRepository.findById(id);
}
我认为不需要在 Repository bean 中创建 getById(... id) 方法 class 因为在 SimpleJPARepository 中已经实现了这样的方法。所以你可以直接调用这个方法。 请参阅官方 spring 文档:-
/*
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#findById(java.io.Serializable)
*/
public Optional<T> findById(ID id) {
Assert.notNull(id, ID_MUST_NOT_BE_NULL);
Class<T> domainType = getDomainClass();
if (metadata == null) {
return Optional.ofNullable(em.find(domainType, id));
}
LockModeType type = metadata.getLockModeType();
Map<String, Object> hints = getQueryHints().withFetchGraphs(em).asMap();
return Optional.ofNullable(type == null ? em.find(domainType, id, hints) : em.find(domainType, id, type, hints));
}