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);
}
}
}