【问题标题】:How to work with Spring Data's Optional<Object> Returns如何使用 Spring Data 的 Optional<Object> Returns
【发布时间】:2018-05-29 01:16:43
【问题描述】:

我们有一个由 Hibernate 生成的域对象拼凑而成,例如

@Entity
@Table(name = "events_t", schema = "public")
public class EventsT implements java.io.Serializable {    
    private int id;
    private RecallsT recallsT; // another table
}

使用 Spring Data,我做不到

RecallsT recallsT = recallsDAO.findById(recallId);

我不得不这样做

Optional<RecallsT> recallsT = recallsDAO.findById(recallId);

但这引入了另一个问题:现在我不能再使用我的 Hibernate 对象了,因为这不起作用:

eventsT.setRecallsT(recallsT);

现在的错误是它无法将“可选<...>”对象放入普通对象中。正如我在 Hibernate 实体中所展示的那样,由于我们的领域对象的生成方式是传统的,因此 setter 采用直接的普通对象。

怎么办?

【问题讨论】:

    标签: hibernate java-8 spring-data


    【解决方案1】:

    你也可以写:

      private Todo findTodoEntryById(Long id) {
            Optional<Todo> todoResult = repository.findOne(id);
            return todoResult.orElseThrow(() -> new TodoNotFoundException(id));
    }
    

    【讨论】:

      【解决方案2】:

      你可以改写

      recallsT.ifPresent(eventsT::setRecallsT);
      

      Optional 表示可能缺少数据,并且具有使用此包装器的方法。 有关正确使用可选is here.的更多信息

      【讨论】:

      • :: ?这是C++还是什么?这在 Java 中有效吗?
      • 方法参考的 java 8 语法 - docs.oracle.com/javase/tutorial/java/javaOO/…
      • 如果我编写自己的@Query findByXX() 方法,它们也必须返回 Optional?因为我可以编写自定义对象来返回普通对象,并且没有问题,它实际上更清晰。我想知道是否应该为返回普通对象的所有内容创建手动存根...
      • @geneb。您不必使用 Optional 编写自定义方法,您可以使用普通对象,null 将指示缺少数据。有关 Spring Data 的存储库返回方法的更多信息,您可以在文档中找到 - docs.spring.io/spring-data/jpa/docs/current/reference/html/…
      猜你喜欢
      • 2018-04-18
      • 2019-07-20
      • 2018-08-25
      • 1970-01-01
      • 2016-06-13
      • 2022-12-02
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多