JPA接口查询方法
JPA接口查询方法
1.Repository接口
Spring Data 里面做数据库操作的最底层的抽象接口,最顶级的父类,源码里面其实什么方法都没有,仅仅起到一个标识作用。管理域类以及域类的 ID 类型作为类型参数,此接口主要作为标记接口来捕获 要使用的类型,并帮助用户发现扩展此接口的接口。Spring 底层做动态代理的时候发现只要是它的子类或者实现类,都代表对储存库操作。
2.CrudRepository接口
相关方法
@NoRepositoryBean public interface CrudRepository<T, ID> extends Repository<T, ID> {
//保存或修改
<S extends T> S save(S var1);
//(1)
//批量保存
<S extends T> Iterable<S> saveAll(Iterable<S> var1);
//(2)
//根据主键查询实体
Optional<T> findById(ID var1);
//(3)
//根据主键判断实体是否存在
boolean existsById(ID var1);
//(4)
//查询实体的所有列表
Iterable<T> findAll
//(5)
//根据主键列表查询实体列表
Iterable<T> findAllById(Iterable<ID> var1);
//(6)
//查询总数
long count();
//(7)
//根据主键删除
void deleteById(ID var1);
//(8)
//根据实体对象删除
void delete(T var1);
//(9)
//根据实体对象批量删除
void deleteAll(Iterable<? extends T> var1);
//(10)
//删除所有数据
void deleteAll();//(11)
}
接口使用
/*** 用户接口 */ public interface UserCrudRepository extends CrudRepository<User,Integer> { }
测试类
@SpringBootTest
class DemoApplicationTests {
@Autowired
private UserRepository userRepository;
@Test
void testInsert() {
User u = new User();
u.setUsername("哈哈");
u.setPassword("123");
u.setCreateTime(new Date().getTime());
userRepository.save(u);
}
@Test
void testDelete(){
User u = new User();
u.setUserId(1L);
userRepository.delete(u);
}
@Test
void testUpdate(){
User u = new User();
u.setUserId(2L);
u.setUsername("阿伟");
userRepository.save(u);
}
@Test
void testSelect(){
List<User> users = new ArrayList<>();
users = (List<User>) userRepository.findAll();
users.forEach(System.out::println);
}
}
3.PagingAndSortingRepository接口的使用
接口使用
public interface UserRepository extends PagingAndSortingRepository<User, Integer> {
}
相关方法
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort var1);
Page<T> findAll(Pageable var1);
}
测试类
@SpringBootTest
class DemoApplicationTests {
@Autowired
private UserRepository userRepository;
/**
* 排序查询
*/
@Test
void testFindAllSort(){
Iterable<User> userIterable = userRepository.findAll(Sort.by(Sort.Direction.DESC, "userId"));
for (User u : userIterable) {
System.out.println(u);
}
}
/**
排序分页
*/
@Test
void testFindAllSortAndPage(){
int pageIndex = 3;//页码
int pageSize = 5;//每页的数量
Iterable<User> userIterable = userRepository.findAll(PageRequest.of(pageIndex-1, pageSize, Sort.by(Sort.Direction.DESC,
"userId")));
for (User u: userIterable){
System.out.println(u);
}
}
}
4.JpagRepository接口的使用
接口使用
public interface UserRepository extends JpaRepository<User, Integer> {
}
相关方法
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
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);
}
5.JpaSpecificationExecutor接口的使用
接口使用
public interface UserRepository extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {
}
相关方法
public interface JpaSpecificationExecutor<T> {
Optional<T> findOne(@Nullable Specification<T> 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);
}
测试类
@SpringBootTest
class DemoApplicationTests {
@Test
void test(){
Page<User> userPage = userRepository.findAll(new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
//获取条件参数对象
Predicate predicate = cb.conjunction();
predicate.getExpressions().add(cb.like(root.get("username"), "%"+ "伟" +"%"));
return predicate;
}
}, PageRequest.of(0, 1, Sort.by(Sort.Direction.DESC, "userId")));
List<User> users = userPage.getContent();
for(User u : users){
System.out.println(u);
}
}
}