Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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/14.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数据获取单个非空值_Java_Spring_Spring Data_Spring Data Jpa - Fatal编程技术网

Java 使用Spring数据获取单个非空值

Java 使用Spring数据获取单个非空值,java,spring,spring-data,spring-data-jpa,Java,Spring,Spring Data,Spring Data Jpa,我希望在我的存储库中有一个返回单个值的方法。 像这样: TrainingMode findByTrainingNameAndNameEng( String trainingName, String nameEng ); Spring数据文档描述,在这种情况下,如果找不到实体,该方法可以返回null。 我想抛出一个异常,其中包含一条通用消息,如%trainingName%和%nameEng%或类似的smth发现的No TrainingMode 我可以使用可选作为返回值,然后使用OrelsThr

我希望在我的存储库中有一个返回单个值的方法。 像这样:

TrainingMode findByTrainingNameAndNameEng( String trainingName, String nameEng );
Spring数据文档描述,在这种情况下,如果找不到实体,该方法可以返回null。 我想抛出一个异常,其中包含一条通用消息,如%trainingName%和%nameEng%或类似的smth发现的
No TrainingMode

我可以使用
可选
作为返回值,然后使用OrelsThrow

Optional<TrainingMode> findByTrainingNameAndNameEng( String trainingName, String nameEng );

repository.findByTrainingNameAndNameEng(name, nameEng).orElseThrow(() -> new RuntimeException(...));
可选findByTrainingNameAndNameEng(字符串训练名称,字符串名称Eng);
findbytrainingname和nameEng(name,nameEng).orelsetrow(()->newruntimeexception(…);
但是每次调用这个方法时,我都应该调用这个方法。还不清楚-干燥原理被破坏了


如何使用Spring数据通过OrelsThrow获得非null单值?

如果在调用它的整个应用程序逻辑中重复null处理,就会违反DRY原则。如果你最担心的是干燥原理,那么我可以想到:

  • 您可以创建一个“服务”类,该类将调用委托给带注释的存储库,并对其处理空响应逻辑,然后使用该服务类而不是直接调用存储库。缺点是在应用程序中引入另一层(这将使存储库与应用程序逻辑分离)

  • 有可能将自定义行为添加到您的数据存储库中,如文档“”部分所述。很抱歉,没有发布该片段


  • 我个人对第二种方法存在的问题是,它会用接口污染应用程序,强制您遵循特定的命名模式(从不喜欢“Impl”后缀),并且可能会使迁移代码更加耗时(当应用程序变大时,跟踪哪个界面负责哪个自定义行为变得越来越困难,然后人们就开始创建自己的行为,结果是另一个行为的复制).

    如果在调用它的整个应用程序逻辑中重复null处理,就会违反DRY原则。如果DRY原则是您最担心的事情,那么我可以想到:

  • 您可以创建一个“服务”类,该类将调用委托给带注释的存储库,并对其处理空响应逻辑,然后使用该服务类而不是直接调用存储库。缺点是将另一层引入到您的应用程序中(这将使存储库与您的应用程序逻辑解耦)

  • 有可能将自定义行为添加到您的数据存储库中,如文档“”部分所述。很抱歉,没有发布此代码段

  • 我个人对第二种方法存在的问题是,它会用接口污染应用程序,强制您遵循特定的命名模式(从不喜欢“Impl”后缀),并且可能会使迁移代码更加耗时(当应用程序变得越来越大时,跟踪哪个界面负责哪个自定义行为变得越来越困难,然后人们就开始创建自己的行为,而结果却是另一个行为的重复)。

    我找到了一个解决方案

    首先,Spring数据同等地处理getByName和findByName。我们可以使用它:在我的例子中,find*可以返回null(或者根据您的意愿返回NOTNULL可选),get*应该只返回值:如果返回null,则抛出异常

    我决定在这个案例中使用AOP。 这是一个方面:

    @Aspect
    @Component
    public class GetFromRepositoryAspect {
        @Around("execution(public !void org.springframework.data.repository.Repository+.get*(..))")
        public Object aroundDaoMethod( ProceedingJoinPoint joinpoint ) throws Throwable {
            Object result = joinpoint.proceed();
            if (null == result) {
                throw new FormattedException( "No entity found with arhs %s",
                        Arrays.toString( joinpoint.getArgs() ) );
            }
            return result;
        }
    }
    
    就这些。

    我找到了解决办法

    首先,Spring数据同等地处理getByName和findByName。我们可以使用它:在我的例子中,find*可以返回null(或者根据您的意愿返回NOTNULL可选),get*应该只返回值:如果返回null,则抛出异常

    我决定在这个案例中使用AOP。 这是一个方面:

    @Aspect
    @Component
    public class GetFromRepositoryAspect {
        @Around("execution(public !void org.springframework.data.repository.Repository+.get*(..))")
        public Object aroundDaoMethod( ProceedingJoinPoint joinpoint ) throws Throwable {
            Object result = joinpoint.proceed();
            if (null == result) {
                throw new FormattedException( "No entity found with arhs %s",
                        Arrays.toString( joinpoint.getArgs() ) );
            }
            return result;
        }
    }
    

    仅此而已。

    您可以通过使用来实现这一点。如果方法返回类型只是某个实体,而不是包装类型,例如
    可选的
    ,则在没有结果的情况下将抛出
    org.springframework.dao.EmptyResultDataAccessException


    阅读更多信息。

    您可以通过使用来实现这一点。如果方法返回类型只是某个实体,而不是包装类型,例如
    可选
    ,则在没有结果的情况下将抛出
    org.springframework.dao.EmptyResultDataAccessException


    阅读更多信息。

    谢谢@Vilius!我还找到了第三种方法-使用AOP。请在此处找到答案:谢谢@Vilius!我还找到了第三种方法-使用AOP。请在此处找到答案: