【问题标题】:Spring Boot findById is not working but findAllById works fineSpring Boot findById 不工作,但 findAllById 工作正常
【发布时间】:2020-04-03 07:01:48
【问题描述】:

我有一个如下定义的投标实体

@ToString
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@Entity
@Table(name = "bid_details")
public class Bid {

    private enum STATUS { INITIATED, DRAFT, COMPLETED }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, updatable = false)
    private Integer id;

    @Column(name = "govt_bid_id", nullable = false)
    private String govtBidNumber;

    @Temporal(TemporalType.DATE)
    @Column(name = "release_date", nullable = false)
    @JsonFormat(pattern = "dd-MM-yyyy")
    private Date releaseDate;

    @ManyToOne(optional = false)
    @JoinColumn(name = "created_by", referencedColumnName = "id", updatable = false, nullable = false)
    private User createdBy;

    @Temporal(TemporalType.DATE)
    @Column(name = "created_date", nullable = false)
    @CreationTimestamp
    private Date createdDate;

    @ManyToOne
    @JoinColumn(name = "updated_by", referencedColumnName = "id", updatable = false, nullable = false)
    private User updatedBy;

    @Enumerated(EnumType.STRING)
    @Column(name = "status", nullable = false)
    private STATUS status;

    @Column(name = "avg_turnover")
    private String avgTurnover;

    @Convert(converter = StringListConverter.class)
    @Column(name = "docs_required", columnDefinition = "json")
    private List<String> docsRequired;

   @Enumerated(EnumType.STRING)
   @Column(name = "status", nullable = false)
   private STATUS status;

}

并且相应的列存在于bid_details 表中。我的投标存储库定义如下:

public interface BidRepository extends JpaRepository<Bid, Integer> {
}

现在,当我尝试使用 findById 通过 id 访问数据时,它会抛出 No Value Present 异常,而如果我尝试使用 findAllById 访问数据,我会得到正确的结果。无法弄清楚是什么导致了这种奇怪的行为。

另外,如果我先执行findAll,然后执行findById,它会给出正确的结果。

我使用的是 spring-boot 版本 2.1.1

以下是实体保存在数据库中的代码

public Bid addBid(BidRequest bidRequest) {
        User user = userRepository.findById(bidRequest.getCreatedBy()).get();
        Bid bid = new Bid();
        modelMapper.map(bidRequest, bid);
        bid.setCreatedBy(user);
        return bidRepository.save(bid);
    }

BidRequest 类如下:

@ToString
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
public class BidRequest {

    private String govtBidNumber;

    @Temporal(TemporalType.DATE)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date releaseDate;

    @Temporal(TemporalType.DATE)
    private Date endDate;

    private int createdBy;

    @Temporal(TemporalType.DATE)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createdDate;

    private int updatedBy;

    private String status;

    private List<String> docsRequired;

}

【问题讨论】:

标签: java spring-boot jpa spring-data-jpa spring-data


【解决方案1】:

你试过orElse这样的

findById(id).orElse(null);

因为findById返回一个Optional对象所以你必须在findById()之后写orElse()

【讨论】:

  • 是的,您可以在 orElse 中抛出错误。实际上,建议您这样做。
  • 感谢您的建议,但它不能解决此问题
  • 有同样的问题。你找到解决办法了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2021-11-02
  • 2020-02-09
  • 2019-01-23
  • 2018-11-02
  • 2019-08-06
相关资源
最近更新 更多