2016-06-12 66 views
1

在我目前的项目中,几乎每一个实体有一个字段recordStatus它可以有2个值:扩展Spring数据的默认语法

  • A主动
  • D用于删除

春天数据的一个可以正常使用:

repository.findByLastName(lastName) 

,但是对于当前的数据模型,我们必须记住每个库调用中的活动部分,例如。

repository.findByLastNameAndRecordStatus(lastName, A) 

的问题是:是否有任何方式来以这样的方式延伸的弹簧数据,将能够识别下面的方法:

repository.findActiveByLastName(lastName) 

并追加

recordStatus = 'A' 

自动?

+0

假设你使用的是hibernate,在你的实体上使用默认的'@ Where'或者使用hibernate过滤器。 –

+0

这听起来似乎是一个好主意,但它会使解决方案无法扩展,它不会允许我们轻松地引入新的状态 – zibi

+2

解决方案会比您拥有的更灵活。您的解决方案需要修改集成代码。 Hibernate过滤器可以用占位符配置。(我强烈建议阅读休眠参考指南)。 –

回答

1

Spring Data JPA为您提供了2个额外的选项来处理DSL默认无法处理的情况。

第一个解决方案是用@Query注释

@Query("select s from MyTable s where s.recordStatus like 'A%'") 
public MyObect findActiveByLastName(String lastName); 

第二种解决方案是增加一个完全自定义的方法“旧时尚之路”,您可以创建一个新类的设置,如自定义查询:MyRepository 默认地将Impl将默认地将Impl是很重要的,因为它是春天如何知道要找到新方法(注:你能避免这一点,但你必须手动连接东西的文档可以帮你)

//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 { 

} 

这些只是一些快速示例可以随时阅读他们的Spring Data JPA文档,如果您想更熟悉它的话。 http://docs.spring.io/spring-data/jpa/docs/current/reference/html/

最后只是一个简短的说明。从技术上讲,这不是Spring Data JPA的内置功能,但您也可以使用Predicates。我会把你链接到这个博客上,因为我不太熟悉这种方法。 https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

0

您可以使用Spring Data的Specifications。看看this文章。

如果您使用recordStatus过滤器创建'基本'规范,并从其中衍生出所有其他规范。

当然,团队中的每个人都应该使用指定操作api,而不是默认的弹簧数据api。