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