多方查询 终于得出join的用法在此记录
- 第一步:建立两表的实体 A和B 并在A属性加入 中B类对象
@Data
@Entity
@Table(name = "A")
public class A implements Serializable {
@Id
//id
private String id;
private String name;
//性别
private String gender;
//与B表关联的id
private Integer bId
@ManyToOne //连接表参数 name中是本实体类中关联字段 referencedColumnName:是该属性中的关联字段
@JoinColumn(name = "bId",referencedColumnName = "id",insertable=false,updatable=false)
private B b;
}
@Data
@Entity
@Table(name = "B")
public class B implements Serializable {
@Id
private String id;
//职位
private String post;
}
2.我写了一个方法 可以不写方法一匿名内部类的形式创建Specification
private Specification<A> getSpecification(String key) {
new Specification<A>() {
@Nullable
@Override
public Predicate toPredicate(Root<A> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
//判断是否模糊查询
if (StringUtils.isNotBlank(key)){
//创建查询条件集合
List<Predicate> orlist = new ArrayList<Predicate>();
//添加查询条件 cb.like:模糊查询 root.get("查询字段").as(类型.class)
orlist.add(cb.like(root.get("name").as(String.class),"%"+ key + "%"));//-------------//
orlist.add(cb.like(root.get("phone").as(String.class), "%"+ key + "%"));//-------------//
orlist.add(cb.like(root.get("role").as(String.class),"%"+ key + "%"));//-------------//
//创建左外连接 Join<左,右> root.join("副表实体在主表主体中的属性名",连接方式)
Join<A,B> join = root.join("b", JoinType.LEFT);
//将连接表需要查询的字段写入
orlist.add(cb.like(join.get("post").as(String.class),"%"+key+"%"));
int s =orlist.size();
return cb.or(orlist.toArray(new Predicate[s]));
}
return null;
}
};
}