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

相关文章
相关标签/搜索