Spring Data Jpa 自定义方法的实现
最近项目中用到了Spring Data JPA,在里面我继承了一个PagingAndSortingRepository的接口,期望的是利用Spring Data JPA提供的便利。
同时我也希望自己有一个能定义自己方法的接口,因为单纯靠Spring Data JPA中提供的功能还是有很多业务逻辑实现不了,我必须自己实现。
那么问题来了:Spring Data JPA好处就是让我们省去了实现接口的过程,按照他们给的命名规范他们会自动实现我们的业务逻辑,那我们自己实现的接口要怎么注入到其中呢?
上网查找了好多资料,都没有说的太详细,更多的是照搬胡抄,这里是我亲自写的,可能很多人会用到,不多说上代码:
自己的接口
- package com.mhc.dao;
- import org.springframework.stereotype.Repository;
- import com.mhc.entity.Person;
-
- @Repository
- public interface DeviceCategoryDaoCustom {
- public Person getsFather(Person person);
- }
主接口
- public interface DeviceCategoryDao extends
- PagingAndSortingRepository<Person, String>, DeviceCategoryDaoCustom {
- }
上面是我的接口继承PagingAndSortingRepository、DeviceCategoryDaoCustom(我自己方法的接口)。
我新建一个类来实现我自己的接口
- package com.mhc.dao;
- import javax.persistence.PersistenceContext;
- import javax.transaction.Transactional;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.data.repository.CrudRepository;
- import org.springframework.data.repository.NoRepositoryBean;
- import org.springframework.stereotype.Component;
- import org.springframework.stereotype.Repository;
- import org.springframework.stereotype.Service;
- import com.mhc.entity.Person;
-
- @Repository("crudRepositoryDaoCustom")
- class DeviceCategoryDaoImpl implements DeviceCategoryDaoCustom {
-
- @Transactional
- public Person getsFather(Person person) {
- // TODO Auto-generated method stub
- Person father = new Person();
- father = person.getParentPerson();
- return father;
- }
- }
在这里有个需要注意的地方,就是用不用implements的问题,如果用的话,他就会调用编译器的实现功能去实现我们自定义的接口也就是:DevicecategoryCustom。
如果去掉的话,他会去实现DeviceCategoryDao,那么会有人问,他怎么去自己找的呢。
事实上他是根据后面的Impl来寻找的。他不会提示@override,不过你写相同的方法他还是会覆盖(覆盖主接口中的同名方法,如果有的话)DeviceCategoryDao中的同名方法。你可以去尝试一下。
同时加上@Repository把他加入到Bean里面,这样下次用这个方法的时候Repository会自动找到他的(话说Spring团队真心NB)。然后我们交给spring托管、测试。。。。。Ok 真心赞
Spring Data Jpa自定义方法关键字
关键字 |
方法名举例 |
对应的SQL |
And |
findByNameAndAge |
where name = ? and age = ? |
Or |
findByNameOrAge |
where name = ? or age = ? |
Is |
findByNameIs |
where name = ? |
Equals |
findByNameEquals |
where name = ? |
Between |
findByAgeBetween |
where age between ? and ? |
LessThan |
findByAgeLessThan |
where age < ? |
LessThanEquals |
findByAgeLessThanEqual |
where age <= ? |
GreatorThan |
findByAgeGreaterThan |
where age > ? |
GreatorThanEquals |
findByAgeGreaterThanEqual |
where age >= ? |
After |
findByAgeAfter |
where age > ? |
Before |
findByAgeBefore |
where age < ? |
IsNull |
findByNameIsNull |
where name is null |
IsNotNull,NotNull |
findByNameIsNotNull,findByNameNotNull |
where name is not null |
Not |
findByNameNot |
where name <>? |
In |
findByAgeIn |
where age in (?) |
NotIn |
findByAgeNotIn |
where age not in (?) |
NotLike |
findByNameNotLike |
where name not like ? |
Like |
findByNameLike |
where name like ? |
StartingWith |
findByNameStartingWith |
where name like ‘?%' |
EndingWith |
findByNameEndingWith |
where name like ‘%?' |
Containing,Contains |
findByNameContaining,findByNameContains |
where name like ‘%?%' |
OrderBy |
findByOrderByAgeDesc |
order by age desc |
True |
findByBossTrue |
where boss = true |
False |
findByBossFalse |
where boss = false |
IgnoreCase |
findByNameIgnoreCase |
where UPPER(name) = UPPER(?) |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。