Spring Data


public interface RoleRepository extends JpaRepository<Role, Long>,JpaSpecificationExecutor{
role getByName(String name);
}
JpaRepository<Role, Long>接口,他的父接口PagingAndSortingRepository提供了分页和排序方法,父父接口CrudRepository开启了事务功能,提供了增删改方法,源接口Repository提供了repository规范。范型第一个填javabean,第二个填主键类型。

条件查询规范(源接口的功能)



举个例子。以下这个方法名的效果就是,where lastName like ?% and id<?
List(Person) getByLastNameStartingWithAndIdLessThan(String lastName,Integer id);
再举一个例子。where email in (?,?,?,-----) or birth < ?
List(Person) getByEmailInOrBirthLessThan(List(String) emails,Date birth)
看着很方便,但是不够灵活去处理复杂的查询业务,名字太长不好。

使用@query注解(源接口的功能)

@Query("select * from Person p where p.name=?1 and p.email=?2", nativeQuery = true)
List(Person)test1(String Name,String email);
?1,?2是占位符,顺序和参数顺序对应。
最好加上nativeQuery = true,这样就能使用sql。

CrudRepository接口提供的方法

public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S var1);//保存

<S extends T> Iterable<S> saveAll(Iterable<S> var1);

Optional<T> findById(ID var1);

boolean existsById(ID var1);

Iterable<T> findAll();

Iterable<T> findAllById(Iterable<ID> var1);

long count();

void deleteById(ID var1);

void delete(T var1);

void deleteAll(Iterable<? extends T> var1);

void deleteAll();

PagingAndSortingRepository接口提供的方法(不能提供带查询条件的分页方法)

` public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort var1);

Page<T> findAll(Pageable var1);
 }`
`例子:
@Autowired
private PersonRepository pRepository;
public void test2(){
int pageNo = 0;//第一页
int pageSize = 5;
PageRequest pageable=new PageRequest(pageNo,pageSize);
Page(Person) page= pRepository.findAll(pageable);

page.getTotalElements();//总记录数
page.getNumber()+1;//当前是第几页
page.getTotalPages;//总页数
//--------------------------------------
//排序
Order o1=new Order(Direction.DESC,"id");
Order o2=new Order(Direction.ASC,"email");
---
Sort sort=new Sort(o1,o2,---);
PageRequest pageable=new PageRequest(pageNo,pageSize,sort);
//同分页了
}`

jpaRepository接口提供的方法

List<T> findAll();

List<T> findAll(Sort var1);//排序

List<T> findAllById(Iterable<ID> var1);

<S extends T> List<S> saveAll(Iterable<S> var1);//批量保存

void flush();

<S extends T> S saveAndFlush(S var1);

void deleteInBatch(Iterable<T> var1);//批量删除

void deleteAllInBatch();//全部删除

T getOne(ID var1);

<S extends T> List<S> findAll(Example<S> var1);

<S extends T> List<S> findAll(Example<S> var1, Sort var2);

JpaSpecificationExecutor接口(对分页的补充,可以在分页时加上条件查询)


`public interface JpaSpecificationExecutor {
Optional findOne(@Nullable Specification var1);

List<T> findAll(@Nullable Specification<T> var1);

Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);

List<T> findAll(@Nullable Specification<T> var1, Sort var2);

long count(@Nullable Specification<T> var1);
}`
PageRequest pageable=new PageRequest(pageNo,pageSize,sort);//同上
Specification<Person> specification=new Specification<Person>(){
//@param root: 代表查询的实体类。可以取到本类属性(某个类)的属性。
//@param query:可以添加查询条件。
//@param cb:获取到Predicate 对象。
//return:Predicate 类型,代表一个查询条件。
@Override
public Predicate toPredicate(Root<Person> root,criteriaQuery<?> query,CriteriaBuilder cb){
Path path=root.get("id");
Predicate p=cb.gt(path,5);//大于5
return predicate;
}
}
Page<Person> page=pRepository.findAll(specification,pageable);
posted @ 2021-06-19 15:08  天才淇露洛  阅读(134)  评论(0编辑  收藏  举报