dao Interface继承Repository接口
可以直接继承Repository也可以继承下面的子接口
CrudRepository
(Spring Data提供)
继承Repository,提供增删改查方法,可以直接调用。
PagingAndSortingRepository
(Spring Data提供)
继承CrudRepository,增加了分页查询和排序两个方法
JpaRepository
(Spring Data JPA提供)
继承PagingAndSortingRepository,是针对JPA技术的接口,提供flush(),saveAndFlush(),deleteInBatch()等方法
继承后可以对数据库进行crud操作。
jpa查询Query的操作
1、解析方法名
持久层接口中定义如下:
public interface UserRepository extends Repository<User, Long> { List<User> findByEmailAddressAndLastname(String emailAddress, String lastname); } |
将会解析为如下的query
select u from User u where u.emailAddress = ?1 and u.lastname = ?2 |
解析时能被识别的keyword和包含这些keyword的方法会被解析成什么样的Query,如下表所示。
Sample |
JPQL snippet | |
And |
findByLastnameAndFirstname |
… where x.lastname = ?1 and x.firstname = ?2 |
Or |
findByLastnameOrFirstname |
… where x.lastname = ?1 or x.firstname = ?2 |
Between |
findByStartDateBetween |
… where x.startDate between 1? and ?2 |
LessThan |
findByAgeLessThan |
… where x.age < ?1 |
GreaterThan |
findByAgeGreaterThan |
… where x.age > ?1 |
IsNull |
findByAgeIsNull |
… where x.age is null |
IsNotNull,NotNull |
findByAge(Is)NotNull |
… where x.age not null |
Like |
findByFirstnameLike |
… where x.firstname like ?1 |
NotLike |
findByFirstnameNotLike |
… where x.firstname not like ?1 |
OrderBy |
findByAgeOrderByLastnameDesc |
… where x.age = ?1 order by x.lastname desc |
Not |
findByLastnameNot |
… where x.lastname <> ?1 |
In |
findByAgeIn(Collection<Age> ages) |
… where x.age in ?1 |
NotIn |
findByAgeNotIn(Collection<Age> age) |
… where x.age not in ?1 |
也可以使用@Query
@Repository
public interface ILoanCifPactDao extends JpaRepository<LoanCifPactVo, Serializable>,JpaSpecificationExecutor<LoanCifPactVo>{
@Query(nativeQuery=true,value="SELECT * FROM S_LOAN_CIF_PACT WHERE ID_NUM=?1 ORDER BY BEGIN_DATE " )
public List<LoanCifPactVo> findPactFixNday2day(String idnum);
}
注意:
1:方法的参数个数必须和@Query里面需要的参数个数一致。
2:如果是like,后面的参数需要前面或者后面加“%”
如果要生成更新类的Query语句,在@Query之前添加@Modifying即可。
@Modifying @Query("update User u set u.firstname = ?1 where u.lastname = ?2") int setFixedFirstnameFor(String firstname, String lastname); |
注意:
1:方法的返回值应该是int,表示更新语句所影响的行数。
2:在调用的地方必须加事务,没有事务不能正常执行。