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:在调用的地方必须加事务,没有事务不能正常执行。