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

Java 是否正确处理SQL查询中的空值?,java,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 ->

我使用此代码通过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();
}
@GetMapping(“页面”)
公共页面页面(@RequestParam(value=“Page”)int Page,@RequestParam(value=“size”)int size){
返回wpfPaymentsService.findAll(页面,大小)
.map(g->WpfPaymentsDTO.builder()
.id(g.getId())
.status(g.getStatus())
.merchant\u id(getMerchantName(g.getMerchant\u id()))
.build());
}
私有字符串getMerchantName(int id){
可选obj=merchantService.findById(id);
返回obj.get().getName();
}
但是,当找不到名称时,我会在这一行得到
java.lang.NullPointerException:null
:merchant\u id(getMerchantName(g.getMerchant\u id())

是否有一些方法可以设置空字符串,并且在找不到对象时不中断代码?

私有字符串getMerchantName(int-id){
private String getMerchantName(int id) {      
    Optional<Merchants> obj = merchantService.findById(id);    

    return obj.isPresent() ?  obj.get().getName() : "";
}
可选obj=merchantService.findById(id); 返回obj.isPresent()?obj.get().getName():“”; }
如果名称为空,可以返回空字符串以避免出现
NPE

private String getMerchantName(int id) {      
    Optional<Merchants> obj = merchantService.findById(id);       
    return obj.isPresent() ?  obj.get().getName() : "";
}
私有字符串getMerchantName(int-id){
可选obj=merchantService.findById(id);
返回obj.isPresent()?obj.get().getName():“”;
}

然后,方法
merchant\u id
应该处理一个空字符串,并可能抛出一个异常(
IllegalArgumentException

而不是调用
obj.get().getName()
使用更可选的解决方案,如:

obj.map(Merchants::getName).orElse("");
当未找到
商家时,将返回空字符串。您可以将上面代码中的
更改为更适合您的情况的任何其他默认值

如果
g.getMerchant\u id()
可以
null
以下代码也将处理此情况:

private String getMerchantName(Integer id) {      
    return Optional.ofNullable(id)
        .flatMap(i -> merchantService.findById(i))
        .map(Merchants::getName)
        .orElse(<default value>);
}
私有字符串getMerchantName(整数id){
返回可选值。不可用值(id)
.flatMap(i->merchantService.findById(i))
.map(商家::getName)
.orElse();
}

它将
id
变为可选,因此当它为
null
时,此代码将返回
,否则它将使用
id
查找
商家,然后获取其名称
flatMap
用于删除嵌套选项。

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

只需添加obj.ifPresent()签入getMerchantName方法。如果这是真的,请使用您的代码。Else返回空字符串。您可以尝试将嵌套的代码包含在“try,catch”表达式中,捕获NullPointerException以防止它停止code@PabloAlvarez否。我得到的方法是ifPresent(ConsumerSorry,该方法是
可选的
isPresent
后跟
get
是一种反模式。这就是
orElse
的发明目的。看起来我又面临一个问题。g.getMerchant_id()在某些情况下是空的。所以我需要在这里添加case来处理空值。
ifPresent
接受一个消费者,它不是一个表达式。这个表达式不是
ifPresent
,它是
isPresent
。在任何情况下,这是一个反模式,应该首选使用
map
orElse
。哦,是的,它是isPresentI changeed我的answerg.getMerchant_id()在某些情况下是空的。我如何处理这种情况?将
getMerchantName
方法签名更改为:
private String getMerchantName(Integer id)
然后在它的主体内
返回可选的.ofNullable(id).flatMap(I->merchantService.findById(I)).map().orElse()
坏消息。我看到这一行
.contract\u id(getContractName(g.getContract\u id())
java.lang.NullPointerException:null这可能是因为
g.getMerchant\u id()
是空的。有什么解决办法吗?我看不到您在问题中提到的那一行。我删掉它是为了节省空间,但代码是一样的。