前言
- JPA中
@Query
注解中要对JPQL进行拼装; 而注解上的字符串是无法使用静态常量的; - JPA中继承
JpaSpecificationExecutor
可以满足复杂查询条件的拼装,但是对复杂的更新,删除等操作,就显得无能无力了 - 故SpringData官方支持对Repository进行拓展,从而满足日益复杂的需求
拓展流程
-
首先需要自定义一个接口; 命名规范没有固定的要求,但是还是推荐以
...CustomRepository
来进行命名,在代码层级上结构更为清晰 -
你所使用SpringData 的
...Repository
需要继承你自定义的接口...CustomRepository
-
这里要格外注意, 你不需要对
...CustomRepository
来构造实现类,而是要构造一个...Repository
的实现类! 并且命名格式 必须为...RepositoryImpl
. 推荐实现类和repository在同一级目录下,因为实现类是不需要任何Spring的注解来将它放置到容器中的,只要命名规范,Spring会自动将该实现类注入到IOC容器中 -
在
...CustomRepository
接口中定义一些你需要用到的复杂接口,或者SpringData的Repository无法满足的,并在...RepositoryImpl
实现类中实现它 -
最后调用的时候,你只需要在Service层暴露出
...Repository
即可,不仅可以使用SpringData原生功能,也可以调用你自定义的Repository的方法
案例DEMO (Assistance业务为例)
- 一个业务repository; 它继承了自定义的
AssistanceCustomRepository
接口
public interface AssistanceRepository extends JpaRepository<Assistance, Long>,
JpaSpecificationExecutor<Assistance>, AssistanceCustomRepository {
int countByAssTypeAndAssState(String assType, Integer assState);
Assistance findByAssGuid(String assGuid);
}
- 拓展自定义repository
/**
* 自定义写Assistance Repository; 满足原生repository JPQL无法拼接等复杂功能
*/
public interface AssistanceCustomRepository {
int passApprove(String assGuid, String urEmpName);
}
- 业务repository的实现类
public class AssistanceRepositoryImpl implements AssistanceCustomRepository {
@PersistenceContext
private EntityManager entityManager;
@Transactional(rollbackFor = {Exception.class})
@Override
public int passApprove(String assGuid, String urEmpName) {
//TODO
...
}
}
- 在service层只需要暴露
assistanceRepository
就可以调用ssistanceCustomRepository
中的方法与SpringData自己的方法
@Service
public class AssistanceService {
@Autowired
private AssistanceRepository assistanceRepository;
public void passApprove(String assGuid){
//注意:这里调用的是拓展repository中的方法
assistanceRepository.passApprove(assGuid, null);
}
}
- 最后贴上 repository的项目结构