**1. 實體類建立關系**
```java
public class Country {
//country 對應 Province.country 屬性名
@OneToMany(mappedBy = "country", fetch = FetchType.EAGER)
private List<Province> provinceList;
}
```
```java
public class Province {
//Country -> Province 是一對多,反過來 Province -> Country 就是多對一
@ManyToOne(targetEntity = Country.class)
//country_id 對應 Country.id 屬性名
//將會在 Province 表中建立 country_id 的物理外鍵
@JoinColumn(name = "country_id", referencedColumnName = "id")
private Country country;
}
```
**2. Specification多表查詢**
```java
/**
* select c.* from country c left join province p on c.id=p.country_id
* where c.continent=亞洲 and p.level=1
*/
@Test
public void example02() {
Specification<Country> spec = (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>(1);
//provinceList 對應 Country.provinceList 屬性名
Join<Country, Province> left = root.join("provinceList", JoinType.LEFT);
predicates.add(cb.equal(root.get("continent").as(String.class), "亞洲"));
//level 對應 Province.level 屬性名
predicates.add(cb.equal(left.get("level").as(Integer.class), 1));
return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
};
List<Country> countryList = countryRepository.findAll(spec);
System.out.println(countryList.size());
}
```
```java
/**
* select p.* from province p left join country c on p.country_id=c.id
* where p.level=1 and c.name=中國
*/
@Test
public void example01() {
Specification<Province> spec = (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>(1);
Join<Province, Country> left = root.join("country", JoinType.LEFT);
predicates.add(cb.equal(root.get("level").as(Integer.class), 1));
predicates.add(cb.equal(left.get("name").as(String.class), "中國"));
return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
};
List<Province> provinceList = provinceRepository.findAll(spec);
System.out.println(provinceList.size());
}
```
- MapStruct屬性映射
- MapStruct是什么
- maven依賴
- 基本映射
- 字段名不一致的映射
- 字段類型不一致的映射
- 基本數據類型轉換
- 日期格式轉換
- 使用表達式轉換
- 枚舉映射
- 多個源類的映射
- 集合的映射
- 添加自定義映射方法
- 映射前后
- 添加默認值
- 映射異常處理
- SpringDataJPA
- SpringDataJPA是什么
- 與JPA、Hibernate的關系
- 環境搭建
- 簡單CURD操作
- 內部原理
- 主鍵生成策略
- 聯合主鍵
- 查詢方式
- 方法命名規則查詢
- 限制查詢結果查詢
- 注解@Query查詢
- 命名參數查詢
- SpEL表達式查詢
- 原生查詢
- 更新與刪除
- Specification動態查詢
- 核心接口
- 查詢例子
- 分頁查詢與排序
- 多表查詢
- 一對一查詢
- 一對多查詢
- 多對多查詢
- 注意事項
- Specification多表查詢
- @Query多表查詢
- 只查詢指定字段
- 級聯操作
- 加載規則