CRUD Repository findById()返回值不同

时间:2018-04-22 14:57:13

标签: java spring crud

在我的SpringBoot应用程序中,我使用的是CrudRepo。 我发现返回值有问题:必填!=找到

GitHub:https://github.com/einhar/WebTaskManager/tree/findById-problem

无论将方法返回类型从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 :(
    }
}

3 个答案:

答案 0 :(得分:4)

findById方法返回Optional,所以你可以通过get()方法获取任务。您可以选择以下3种情况 未找到任务时,您将收到异常:

>>> s = """
... #Version number
... Version=20
... 
... #Mode name
... Mode=Slow
... list=True
... type=8475
... """
>>> s = s.replace('Slow', 'Fast')
>>> print(s)

#Version number
Version=20

#Mode name
Mode=Fast
list=True
type=8475

>>> 

找不到任务时,您将获得null:

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());
}

答案 1 :(得分:0)

在你的CrudRepo中创建一个方法:

Task getById(Integer id);

然后在TaskService中调用此方法,您应该准备好了:)

答案 2 :(得分:0)

我认为不需要在Repository bean类中创建getById(... id)方法,因为在SimpleJPARepository中已经实现了这种方法。因此,您可以直接调用此方法。 参见春季官方文件:-

/*
     * (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));
    }