Java 扩展弹簧数据';默认语法

Java 扩展弹簧数据';默认语法,java,spring,spring-data,Java,Spring,Spring Data,在我当前的项目中,几乎每个实体都有一个字段recordStatus,它可以有两个值: A用于活动 D用于删除 在spring数据中,通常可以使用: repository.findByLastName(lastName) 但是对于当前的数据模型,我们必须记住每个存储库调用中的活动部分,例如 repository.findByLastNameAndRecordStatus(lastName, A) 问题是:是否有任何方法可以扩展spring数据,使其能够识别以下方法: repository.

在我当前的项目中,几乎每个实体都有一个字段
recordStatus
,它可以有两个值:

  • A
    用于活动
  • D
    用于删除
在spring数据中,通常可以使用:

repository.findByLastName(lastName)
但是对于当前的数据模型,我们必须记住每个存储库调用中的活动部分,例如

repository.findByLastNameAndRecordStatus(lastName, A)
问题是:是否有任何方法可以扩展spring数据,使其能够识别以下方法:

repository.findActiveByLastName(lastName)
并附加

recordStatus = 'A'

自动?

Spring Data JPA为您提供了两个附加选项,用于处理DSL默认无法处理的情况

第一种解决方案是带有@Query注释的自定义查询

@Query("select s from MyTable s where s.recordStatus like 'A%'")
public MyObect findActiveByLastName(String lastName);
第二个解决方案是添加一个完全自定义的方法,即“旧方式”,您可以创建一个新的类设置,如:MyRepositoryImpl。Impl很重要,因为它是spring如何知道如何找到新方法的(注意:您可以避免这种情况,但您必须手动链接文档可以帮助您的内容)

//实现
公共类MyRepositoryImpl实现MyCustomMethodInterface{
@持久上下文
实体管理器;
公共对象myCustomJPAMethod(){
//TODO自定义JPA工作与此类似
字符串myQuery=“TODO”;
返回em.createQuery(myQuery).execute();
}
}
//接口
公共接口MyCustomMethodInterface{
公共对象myCustomJPMethod();
}
//为了清晰起见,请同时更新您的JPA存储库,以便人们看到您的自定义工作
公共接口MySuperEpicRepository扩展了JPARepository、MyCustomMethodInterface{
}
这些只是一些简单的示例,如果您想对其进行更多定制,请随意阅读他们的Spring数据JPA文档。

最后只是一个简短的说明。从技术上讲,这不是SpringDataJPA的内置特性,但您也可以使用谓词。我会把你链接到这个博客上,因为我对这个方法不太熟悉。

您可以使用Spring Data的
规范。看看这篇文章

如果您使用recordStatus筛选器创建一个“基本”规范,并从该规范派生所有其他规范


当然,您团队中的每个人都应该使用Specifications api,而不是默认的spring数据api。

我不确定您是否可以扩展语法,除非您重写基类(
SimpleReactiveMongoRepository
;这是针对被动mongo的,但您可以找到适合DB类型的类),我可以建议您扩展基本方法,然后让您的方法知道要执行的条件。如果你查看这篇文章,你就会知道我为所有实体的补丁操作做了什么


假设您正在使用hibernate,请在实体上使用默认的
@Where
,或者使用hibernate筛选器。这听起来是个好主意,但它会使解决方案无法扩展,不允许我们轻松引入新状态。该解决方案比您现有的解决方案更灵活。您的解决方案需要对集成代码进行修改。Hibernate筛选器可以配置占位符。(我强烈建议您阅读hibernate参考指南)。很好,这看起来是朝着正确方向迈出的一步。目前您最好的选择是
@Where
,而不是这是一个已知的问题,spring团队正在根据以下jira进行研究:
//Implementation
public class MyRepositoryImpl implements MyCustomMethodInterface {
   @PersistenceContext
   EntityManager em;

    public Object myCustomJPAMethod() {
       //TODO custom JPA work similar to this
       String myQuery = "TODO";
       return em.createQuery(myQuery).execute();
    }
}

//Interface
public interface MyCustomMethodInterface {
    public Object myCustomJPAMethod();
}

//For clarity update your JPA repository as well so people see your custom work
public interface MySuperEpicRepository extends JPARepository<Object, String>, MyCustomMethodInterface {

}