springdatajpa進階動態sql
阿新 • • 發佈:2019-01-11
springdatajpa高階應用
1.specifications的動態查詢方法概述
T findOne(Specification<T> spec); //查詢單個物件
List<T> findAll(Specification<T> spec); //查詢列表
//查詢全部,分頁
//pageable:分頁引數
//返回值:分頁pageBean(page:是springdatajpa提供的)
Page<T> findAll(Specification<T> spec, Pageable pageable);
//查詢列表
//Sort:排序引數
List<T> findAll(Specification<T> spec, Sort sort);
long count(Specification<T> spec);//統計查詢
*Specification :查詢條件
####2.環境配置–略,同入門小呆萌
###3.單條件查詢:條件存在,新增條件,條件不存在,查詢所有
/**
* 1.單條件查詢,-->動態查詢,如果該欄位的條件存在,則新增該條件,如果該條件不存在,查詢所有
*/
@Test
public void test01(){
//定義查詢條件
final String address = "beijing";
Specification<Customer> spec = new Specification<Customer>() {
public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
Predicate beijing = null;
//1.findOne原本只提供主鍵查詢,要想依據其他屬性進行查詢,必須使用的Spec的高階查詢
//對條件進行判斷
if (address!=null && !"".equals(address)){
//1.1按 custAddress 屬性進行查詢,該名稱必須是實體類的成員變數---獲取成員變數
Path<Object> custAddress = root.get("custAddress"); //引數必須與實體類成員變數一致
//1.2構建查詢條件, 引數1:Path屬性物件,引數2:匹配的條件
beijing = cb.equal(custAddress, address);
}
return beijing;
}
};
List<Customer> customerList = customerDao.findAll(spec);
for (Customer customer : customerList) {
System.out.println(customer);
}
}
4.多條件查詢
/**
* 2.多條件查詢:條件存在則加入條件,條件不存在則,不加入,條件這件使用連線符:如and ,or,...
* 對於非equals查詢,如模糊查詢:like,查詢的欄位必須宣告欄位型別
*/
@Test
public void test02() {
//方法傳入的條件
final String addressStr = "你從哪裡來";
final String nameStr = "%j%";
Specification<Customer> spec = new Specification<Customer>() {
public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//獲取查詢物件屬性
Path<Object> custName = root.get("custName");
Path<Object> custAddress = root.get("custAddress");
//構建查詢條件
Predicate custNameSpec = null;
if (nameStr != null && !"".equals(nameStr)) {
custNameSpec = criteriaBuilder.equal(custName, "你從哪裡來");
}
Predicate custAddressSpec = null;
if (addressStr != null && !"".equals(addressStr)) {
//注:如果不是equals,必須申明屬性的資料型別
custAddressSpec = criteriaBuilder.like(custAddress.as(String.class), "%j%");
}
//連線符,and並且的關係
Predicate and = criteriaBuilder.and(custNameSpec, custAddressSpec);
return and;
}
};
Customer one = customerDao.findOne(spec);
System.out.println("one = " + one);
}
5.分頁查詢
/**
* 分頁查詢:維護分頁物件
*/
@Test
public void test03() {
//分頁物件 ,引數1:頁碼開始從0開始,引數2:每頁的大小
Pageable page = new PageRequest(1,2);
Page<Customer> all = customerDao.findAll(page);
//獲取每頁內容
List<Customer> content = all.getContent();
for (Customer customer : content) {
System.out.println(customer);
}
//獲取總記錄數
long totalElements = all.getTotalElements();
System.out.println("totalElements = " + totalElements);
//獲取總頁數
int totalPages = all.getTotalPages();
System.out.println("totalPages = " + totalPages);
}
6.排序查詢
/**
* 排序查詢:維護,排序物件
*/
@Test
public void test04() {
//引數1:排序方式,升或者降,引數2:排序欄位屬性
Sort sort = new Sort(Sort.Direction.DESC,"custName");
List<Customer> all = customerDao.findAll(sort);
for (Customer customer : all) {
System.out.println("customer = " + customer);
}
}