spring data 支持的关键字
keywordsamplejpql snippetandfindbylastnameandfirstname… where x.lastname = ?1 and x.firstname = ?2orfindbylastnameorfirstname… where x.lastname = ?1 or x.firstname = ?2is,equalsfindbyfirstname,findbyfirstnameis,findbyfirstnameequals… where x.firstname = 1?betweefindbystartdatebetween… where x.startdate between 1? and ?2lessthanfindbyagelessthan… where x.age < ?1lessthanequalfindbyagelessthanequal… where x.age <= ?1greaterthanfindbyagegreaterthan… where x.age > ?1greaterthanequalfindbyagegreaterthanequal… where x.age >= ?1afterfindbystartdateafter… where x.startdate > ?1beforefindbystartdatebefore… where x.startdate < ?1isnullfindbyageisnull… where x.age is nullisnotnull,notnullfindbyage(is)notnull… where x.age not nulllikefindbyfirstnamelike… where x.firstname like ?1notlikefindbyfirstnamenotlike… where x.firstname not like ?1startingwithfindbyfirstnamestartingwith… where x.firstname like ?1(parameter bound with appended %)endingwithfindbyfirstnameendingwith… where x.firstname like ?1 (parameter bound with prepended %)containingfindbyfirstnamecontaining… where x.firstname like ?1(parameter bound wrapped in %)orderbyfindbyageorderbylastnamedesc… where x.age = ?1 order by x.lastname descnotfindbylastnamenot… where x.lastname <> ?1infindbyagein(collection<age> ages)… where x.age in ?1notinfindbyagenotin(collection<age> age)… where x.age not in ?1truefindbyactivetrue()… where x.active = truefalsefindbyactivefalse()… where x.active = falseignorecasefindbyfirstnameignorecase… where upper(x.firstame) = upper(?1)@query 注解
这种查询可以声明在 repository 方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是 spring data 的特有实现。
索引参数:
索引值从1开始,查询中 ?x 的个数需要与方法形参个数相等,并且顺序也要一致。
@query("select p from person p where p.lastname = ?1 and p.age = ?2")
person getbylastnameandage(string lastname, int age);
命名参数:
可以定义好参数名,赋值值采用 @param(参数名),而不用管顺序。
@query("select p from person p where p.lastname = :lastname and p.id = :id")
person getbylastnameandid(@param("id")int id, @param("lastname")string lastname);
本地查询:
可以使用 @query 执行本地查询,只要设置 nativequery 为 true。
@query(value = "select count (id) from jpa_persons", nativequery = true)
long gettotalcount();
@modifying 注解和事务
@query 与 @modifying 这两个注解一起使用,可以执行 update、delete 操作。
注意,update、delete 需要使用事务,因此需要定义在 service 层。
事务:
spring data 提供了默认的事务处理方式,即所有的查询均为只读事务。
对于自定义的方法,如需改变 spring data 提供的事务方式,可以在方法上添加 @transactional 注解。
进行多个 repository 操作时,也应该使它们在同一个事务中处理,按照分层架构的思想,这部分属于业务逻辑层,因此,需要在 service 层实现对多个 repository 的调用,并在相应的方法上声明事务。 crudrepository 接口
crudrepository 接口提供了最基本的对实体类的添删改查操作
t save(t entity) 保存单个实体
iterable<t> save(iterable<? extends t> entities) 保存集合
t findone(id id) 根据id查找实体
boolean exists(id id) 根据id判断实体是否存在
iterable<t> findall() 查询所有实体,不用或慎用
long count() 查询实体数量
void delete(id id) 根据id删除实体
void delete(t entity) 删除一个实体
void delete(iterable<? extends t> entities) 删除一个实体的集合
void deleteall() 删除所有实体,不用或慎用 pagingandsortingrepository 接口
该接口提供了分页与排序功能
iterable<t> findall(sort sort) 排序
page<t> findall(pageable pageable) 分页查询(含排序功能)
@test
public void testpagingandsortingrespository(){
int pageno = 3;
int pagesize = 5;
sort.order order = new sort.order(sort.direction.desc, "id");
sort.order order1 = new sort.order(sort.direction.asc, "email");
sort sort = new sort(order,order1);
pagerequest pageable = new pagerequest(pageno, pagesize, sort);
page<person> page = personrepository.findall(pageable);
system.out.println(page.getnumberofelements());
system.out.println(page.getcontent());
}