Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当没有为Spring JPA标准指定值时,如何避免NPE_Java_Spring_Jpa Criteria - Fatal编程技术网

Java 当没有为Spring JPA标准指定值时,如何避免NPE

Java 当没有为Spring JPA标准指定值时,如何避免NPE,java,spring,jpa-criteria,Java,Spring,Jpa Criteria,我有一个Spring JPA搜索条件,如下所示。其中面积为整数 cb.between(root.get(Property_.area), searchConstraint.getAreaMin(), searchConstraint.getAreaMax()) 问题是,当用户在搜索中没有指定上限或下限时,该值为null,这将导致NPE。我想到的一件事是对null值进行if检查,并将值设置为Integer.MAX_VAL(如果为null)作为解决方法。这样我可以避免NPE,但也会创建大量if-e

我有一个Spring JPA搜索条件,如下所示。其中面积为整数

cb.between(root.get(Property_.area), searchConstraint.getAreaMin(), searchConstraint.getAreaMax())

问题是,当用户在搜索中没有指定上限或下限时,该值为null,这将导致NPE。我想到的一件事是对null值进行if检查,并将值设置为Integer.MAX_VAL(如果为null)作为解决方法。这样我可以避免NPE,但也会创建大量if-else检查。所以我想知道是否有更好的方法

我想到了两种更清洁的解决方案:

  • 使用选项,例如`Optional.ofNullable(searchConstraint.getAreaMax()).orElse(Integer.MAX_值)
  • areaMin和areaMax应有合理的默认值,只有在用户提供某些数据时才会覆盖这些值;应该验证数据本身

    • 我想到了两种更清洁的解决方案:

      • 使用选项,例如`Optional.ofNullable(searchConstraint.getAreaMax()).orElse(Integer.MAX_值)
      • areaMin和areaMax应有合理的默认值,只有在用户提供某些数据时才会覆盖这些值;应该验证数据本身

      如果getAreaMin和getAreaMax为空,您可以避免/忽略以添加此条件。 如果getAreaMin为NULL且getAreaMax不为NULL,则可以使用le()而不是between,getAreaMax也可以使用gt()方法; “如果”代码正常

      大概是这样的:

       if(isNotNull(searchConstraint.getAreaMin()) && isNotNull(searchConstraint.getAreaMax())) {
               cb.between(root.get(Property_.area), searchConstraint.getAreaMin(), searchConstraint.getAreaMax())
       }else{
           if(isNotNull(searchConstraint.getAreaMin()){
                cb.gt(root.get(Property_.area), searchConstraint.getAreaMin());
           }else{
                cb.le(root.get(Property_.area), searchConstraint.getAreaMax());
           }
       } 
      
      或者,您可以创建一个util方法,如(但prev变量更好地解决dut的性能问题):

      执行:
      cb.between(root.get(Property.area)、getValueOrDefault(searchConstraint.getAreaMin()、Integer.MIN_值)、getValueOrDefault(searchConstraint.getAreaMax()、Integer.MAX_值))

      如果getAreaMin和getAreaMax为空,则可以避免/忽略添加此条件。 如果getAreaMin为NULL且getAreaMax不为NULL,则可以使用le()而不是between,getAreaMax也可以使用gt()方法; “如果”代码正常

      大概是这样的:

       if(isNotNull(searchConstraint.getAreaMin()) && isNotNull(searchConstraint.getAreaMax())) {
               cb.between(root.get(Property_.area), searchConstraint.getAreaMin(), searchConstraint.getAreaMax())
       }else{
           if(isNotNull(searchConstraint.getAreaMin()){
                cb.gt(root.get(Property_.area), searchConstraint.getAreaMin());
           }else{
                cb.le(root.get(Property_.area), searchConstraint.getAreaMax());
           }
       } 
      
      或者,您可以创建一个util方法,如(但prev变量更好地解决dut的性能问题):

      执行:
      cb.between(root.get(Property.area)、getValueOrDefault(searchConstraint.getAreaMin()、Integer.MIN_值)、getValueOrDefault(searchConstraint.getAreaMax()、Integer.MAX_值))

      如果两个值都可以为null,我建议将
      查询拆分为两个谓词,然后将它们组合起来。这样,您还可以处理两个都为空的情况:

      List<Predicate> predicates = new ArrayList<>();
      if (searchConstraint.getAreaMin() != null)
          predicates.add(cb.gt(root.get(Property_.area), searchConstraint.getAreaMin()))
      if (searchConstraint.getAreaMax() != null)
          predicates.add(cb.lt(root.get(Property_.area), searchConstraint.getAreaMax()))
      if (predicates.size() > 0)
          cb.and(predicates.toArray(new Predicate[predicates.size()]))
      
      List谓词=new ArrayList();
      if(searchConstraint.getAreaMin()!=null)
      add(cb.gt(root.get(Property.area),searchConstraint.getAreaMin())
      if(searchConstraint.getAreaMax()!=null)
      add(cb.lt(root.get(Property.area),searchConstraint.getAreaMax())
      if(谓词.size()>0)
      and(predicates.toArray(新谓词[predicates.size()]))
      
      如果两个值都可以为null,我建议将
      查询拆分为两个谓词,然后将它们组合起来。这样,您还可以处理两个都为空的情况:

      List<Predicate> predicates = new ArrayList<>();
      if (searchConstraint.getAreaMin() != null)
          predicates.add(cb.gt(root.get(Property_.area), searchConstraint.getAreaMin()))
      if (searchConstraint.getAreaMax() != null)
          predicates.add(cb.lt(root.get(Property_.area), searchConstraint.getAreaMax()))
      if (predicates.size() > 0)
          cb.and(predicates.toArray(new Predicate[predicates.size()]))
      
      List谓词=new ArrayList();
      if(searchConstraint.getAreaMin()!=null)
      add(cb.gt(root.get(Property.area),searchConstraint.getAreaMin())
      if(searchConstraint.getAreaMax()!=null)
      add(cb.lt(root.get(Property.area),searchConstraint.getAreaMax())
      if(谓词.size()>0)
      and(predicates.toArray(新谓词[predicates.size()]))
      
      在我看来,这些方法永远不应该返回null,而应该返回默认值。因此,如果它是一个列表,则返回
      集合。空列表
      ,如果它是int,则返回
      0
      整数。最小值
      ,具体取决于上下文等。请检查NullObject模式:。也许可以考虑使用<代码> opthOrths<代码>。在我看来,你不应该从这些方法返回null,而是默认的。因此,如果它是一个列表,则返回
      集合。空列表
      ,如果它是int,则返回
      0
      整数。最小值
      ,具体取决于上下文等。请检查NullObject模式:。请考虑使用<代码>选项>代码>谢谢大家的宝贵意见。最后一个选项是可选的.ofNullable(searchConstraint.getAreaMax()).orElse(Integer.MAX_VALUE)最适合我。再次感谢,谢谢大家提出的宝贵意见。最后一个选项是可选的.ofNullable(searchConstraint.getAreaMax()).orElse(Integer.MAX_VALUE)最适合我。再次感谢。