Spring JPA Specification 多表查询 左连接的用法

User 表中字段 

id // 主键
name
mobile
age
company_id // 对应关联company的注解id

Company表中有字段

id // 主键id
name
code
address

对应实体如下

@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
}

下面我们查询,用户姓名模糊匹配“刘", 或者 用户所在公司名称匹配"有限公司"的列表 

方式一:简单 Specification查询

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,也查不到数据

方式二:左连接Specification 查询

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展示。

 

转载于:https://my.oschina.net/u/3725073/blog/1920022

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值