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。请在此处找到答案: