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