求職複習系列9 jpa學習筆記3

動態查詢

JpaSpeciationExecutor
\t\tT findOne(Specification spec); //查詢單個對象
\t\tList findAll(Specification spec); //查詢列表
\t\t//查詢全部,分頁
\t\t//pageable:分頁參數
\t\t//返回值:分頁pageBean(page:是springdatajpa提供的)
\t\tPage findAll(Specification spec, Pageable pageable);
\t\t//查詢列表
\t\t//Sort:排序參數
\t\tList findAll(Specification spec, Sort sort);
\t\tlong count(Specification spec);//統計查詢
\t\t
\t* Specification :查詢條件
\t\t自定義我們自己的Specification實現類
\t\t\t實現
\t\t\t\t//root:查詢的根對象(查詢的任何屬性都可以從根對象中獲取)
\t\t\t\t//CriteriaQuery:頂層查詢對象,自定義查詢方式(瞭解:一般不用)
\t\t\t\t//CriteriaBuilder:查詢的構造器,封裝了很多的查詢條件
\t\t\t\tPredicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder cb); //封裝查詢條件
測試
@Test
public void testDpec(){
//匿名內部類
/**
* 自定義查詢條件

* 1.實現Specification接口(提供泛型:查詢的對象類型)
* 2.實現toPredicate方法(構造查詢條件)
* 3.需要藉助方法參數中的兩個參數(
* root:獲取需要查詢的對象屬性
* CriteriaBuilder:構造查詢條件的,內部封裝了很多的查詢條件(模糊匹配,精準匹配)
* )
* 案例:根據客戶名稱查詢,查詢客戶名為傳智播客的客戶
* 查詢條件
* 1.查詢方式
* cb對象
* 2.比較的屬性名稱
* root對象
*
*/
Specification<dept> specification=new Specification<dept>() {
public Predicate toPredicate(Root<dept> root, CriteriaQuery> criteriaQuery, CriteriaBuilder criteriaBuilder) {
// 1 獲得比較屬性
Path<object> dname=root.get("dname");
// 2 構造條件
/**
* 第一個參數:需要比較屬性(Path對象)
* 第二個參數:比較當前的取值
*/
Predicate predicate=criteriaBuilder.equal(dname,"RESEARCH");//進行精準匹配
return predicate;
}
};//注意匿名類的;
Dept dept=deptDao.findOne(specification);
System.out.println(dept);
}
>>多條件
@Test

public void testSpecMany(){
Specification<dept> specification=new Specification<dept>() {
public Predicate toPredicate(Root<dept> root, CriteriaQuery> criteriaQuery, CriteriaBuilder criteriaBuilder) {
Path<object> dname=root.get("dname");
Path<object> loc=root.get("loc");
Predicate predicate=criteriaBuilder.equal(dname,"RESEARCH");
Predicate predicate2=criteriaBuilder.equal(loc,"BOSTON");
/* equal :直接的到path對象(屬性),然後進行比較即可
* gt,lt,ge,le,like : 得到path對象,根據path指定比較的參數類型,再去進行比較
* 指定參數類型:path.as(類型的字節碼對象)
*/
//如
// Predicate like=criteriaBuilder.like(dname.as(String.class),"RE%");
Predicate or=criteriaBuilder.or(predicate,predicate2);

return or;
}
};
List<dept> list=deptDao.findAll(specification);
for(Dept dept:list){
System.out.println(dept);
}
}
排序
調用時
//創建排序對象,需要調用構造方法實例化sort對象
//第一個參數:排序的順序(倒序,正序)
// Sort.Direction.DESC:倒序
// Sort.Direction.ASC : 升序
//第二個參數:排序的屬性名稱
Sort sort=new Sort(Sort.Direction.DESC,"dname")
List<dept> list=deptDao.findAll(specification,sort);
分頁<<<<<<<<
/**
* 分頁查詢
* Specification: 查詢條件
* Pageable:分頁參數

* 分頁參數:查詢的頁碼,每頁查詢的條數
* findAll(Specification,Pageable):帶有條件的分頁
* findAll(Pageable):沒有條件的分頁
* 返回:Page(springDataJpa為我們封裝好的pageBean對象,數據列表,共條數)
*/
@Test
public void testSpecPage() {
Specification spec = null;
//PageRequest對象是Pageable接口的實現類
/**
* 創建PageRequest的過程中,需要調用他的構造方法傳入兩個參數
* 第一個參數:當前查詢的頁數(從0開始)
* 第二個參數:每頁查詢的數量
*/
Pageable pageable = new PageRequest(0,2);
//分頁查詢
Page<dept> page = deptDao.findAll(null, pageable);
System.out.println(page.getContent()); //得到數據集合列表
System.out.println(page.getTotalElements());//得到總條數
System.out.println(page.getTotalPages());//得到總頁數
}
關聯關係
一對多
//配置客戶和聯繫人的一對多關係
@OneToMany(targetEntity=另一方的entity.class)
@JoinColumn(name="當前的列",referencedColumnName="對方的主鍵名id")//
集合類型
多對一
//多對一關係映射:多個聯繫人對應客戶
@ManyToOne(targetEntity=Customer.class)

@JoinColumn(name="lkm_cust_id",referencedColumnName="cust_id")
private Customer customer;//用它的主鍵,對應聯繫人表中的外鍵

雙向的時候會有多餘的update語句,在一的一方放棄關係維護
一的一方註解為
@OneToMany(mappedBy="對方的屬性名稱")
/* cascade:配置級聯操作
* CascadeType.MERGE 級聯更新
* CascadeType.PERSIST 級聯保存:
* CascadeType.REFRESH 級聯刷新:
* CascadeType.REMOVE 級聯刪除:
* CascadeType.ALL 包含所有
*/
@OneToMany(mappedBy="customer",cascade=CascadeType.ALL)
刪除
刪除主表數據:

有從表數據
1、在默認情況下,它會把外鍵字段置為null,然後刪除主表數據。如果在數據庫的表
結構上,外鍵字段有非空約束,默認情況就會報錯了。
2、如果配置了放棄維護關聯關係的權利,則不能刪除(與外鍵字段是否允許為null,
沒有關係)因為在刪除時,它根本不會去更新從表的外鍵字段了。
3、如果還想刪除,使用級聯刪除引用

沒有從表數據引用:隨便刪
在實際開發中,級聯刪除請慎用!(在一對多的情況下)

多對多
/**
* 配置用戶到角色的多對多關係
* 配置多對多的映射關係
* 1.聲明表關係的配置
* @ManyToMany(targetEntity = Role.class) //多對多
* targetEntity:代表對方的實體類字節碼
* 2.配置中間表(包含兩個外鍵)
* @JoinTable
* name : 中間表的名稱
* joinColumns:配置當前對象在中間表的外鍵
* @JoinColumn的數組
* name:外鍵名
* referencedColumnName:參照的主表的主鍵名
* inverseJoinColumns:配置對方對象在中間表的外鍵
*/
@ManyToMany(targetEntity = Role.class,cascade = CascadeType.ALL)
@JoinTable(name = "sys_user_role",
//joinColumns,當前對象在中間表中的外鍵
joinColumns = {@JoinColumn(name = "sys_user_id",referencedColumnName = "user_id")},
//inverseJoinColumns,對方對象在中間表的外鍵
inverseJoinColumns = {@JoinColumn(name = "sys_role_id",referencedColumnName = "role_id")}
)

多對多在被選擇放放棄維護
@ManyToMany(targetEntity = Role.class)
懶加載和預加載
從一方查詢多方 * 默認:使用延遲加載(****) 在註解上修改: fetch =FetchType.EAGER 立即 fetch =FetchType.LAZY 懶加載 從多方查詢一方 * 默認:使用立即加載
/<dept>/<dept>/<dept>/<object>/<object>/<dept>/<dept>/<dept>/<object>/<dept>/<dept>/<dept>


分享到:


相關文章: