User 表中字段 java
id // 主鍵 name mobile age company_id // 對應關聯company的註解id
Company表中有字段code
id // 主鍵id name code address
對應實體以下ci
@Entity @Table("User") public class User { @Id private Long id; @Column("name") private String name; @Column("mobile") private String mobile; @Column("age") private Integer age; @ManyToOne @JoinColumn("company_id") private Company company; // getter & setter }
@Entity @Table("Company") public class Company { @Id private Long id; @Column("name") private String name; @Column("mobile") private String code; @Column("address") private String address; // getter & setter }
下面咱們查詢,用戶姓名模糊匹配「劉", 或者 用戶所在公司名稱匹配"有限公司"的列表 get
方式一:簡單 Specification查詢it
public void test1() { userDao.findAll( (root, query, cb) -> { Predicate namePre = cb.like(root.get("name"), "%" + "劉" + "%"); Predicate companyPre = cb.like(root.get("company").get("name"), "%" + "有限公司" + "%"); return cb.or(namePre, companyPre); }); }
這種方式,用戶確實有關聯對應的公司信息時,能夠正常查詢。 但當用戶表字段 company_id 無對應的數據時,雖然兩個條件間關係爲or,也查不到數據io
方式二:左鏈接Specification 查詢class
public void test2() { userDao.findAll( (root, query, cb) -> { // 使用左鏈接查詢 Join<User, Company> companyJoin = root.join("company", JoinType.LEFT); Predicate namePre = cb.like(root.get("name"), "%" + "劉" + "%"); Predicate companyPre = cb.like(companyJoin.get("name"), "%" + "有限公司" + "%"); return cb.or(namePre, companyPre); }); }
左鏈接查詢: 就是已左邊的表爲基準,先將左表查出的數據顯示出來,再顯示關聯的右表中查詢出的數據,沒有關聯數據則字段值以null展現。test