正确处理SQL查询中的空值?

时间:2019-04-01 09:34:17

标签: java

我使用此代码通过ID获取商家名称。

@GetMapping("pages")
public Page<WpfPaymentsDTO> pages(@RequestParam(value = "page") int page, @RequestParam(value = "size") int size) {
    return wpfPaymentsService.findAll(page, size)
                             .map(g -> WpfPaymentsDTO.builder()
                             .id(g.getId())
                             .status(g.getStatus())
                             .merchant_id(getMerchantName(g.getMerchant_id()))
                             .build());  
}

private String getMerchantName(int id) {      
    Optional<Merchants> obj = merchantService.findById(id);       
    return obj.get().getName();
}

但是当找不到名称时,我在这行得到java.lang.NullPointerException: null.merchant_id(getMerchantName(g.getMerchant_id()))

有什么方法可以设置空字符串,并且在找不到对象时不破坏代码?

4 个答案:

答案 0 :(得分:2)

代替调用obj.get().getName(),请使用更多可选方式,例如:

obj.map(Merchants::getName).orElse("");

,如果找不到Merchants,它将返回空字符串。您可以将上面代码中的""更改为更适合您情况的其他任何默认值。

如果g.getMerchant_id()可以是null,则下面的代码也可以解决这种情况:

private String getMerchantName(Integer id) {      
    return Optional.ofNullable(id)
        .flatMap(i -> merchantService.findById(i))
        .map(Merchants::getName)
        .orElse(<default value>);
}

它将把id变成可选的,所以当它变成null时,此代码将只返回<default value>,否则它将使用id查找Merchants并然后得到它的名字。 flatMap在这里用于删除嵌套的可选内容。

答案 1 :(得分:1)

private String getMerchantName(int id) {      
    Optional<Merchants> obj = merchantService.findById(id);    

    return obj.isPresent() ?  obj.get().getName() : "";
}

答案 2 :(得分:1)

如果名称为null,则可以返回一个空字符串以避免NPE

private String getMerchantName(int id) {      
    Optional<Merchants> obj = merchantService.findById(id);       
    return obj.isPresent() ?  obj.get().getName() : "";
}

然后方法merchant_id应该处理一个空字符串,并可能引发异常(例如,IllegalArgumentException)。

答案 3 :(得分:0)

我认为我们可以在返回该对象之前确定该对象是否为空