Spring JPA Specification 多表查詢 左鏈接的用法

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

相關文章
相關標籤/搜索