通过实体类映射实现多表关联条件查询
jpa对于多表关联可以在实体类中进行关联映射,一对一用@OneToOne,一对多用@OneToMany,多对多用@ManyToMany,多对一用@ManyToOne,具体实体类配置就不多说了,然后对于条件查询采用Specification对象进行封装,如下
Specification<A> specification = new Specification<A>() {
@Override
public Predicate toPredicate(Root<A> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
//创建查询条件集合
List<Predicate> orlist = new ArrayList<Predicate>();
//判断是否模糊查询
if (StringUtils.isNotBlank(key)){
//添加查询条件 :模糊查询 ("查询字段").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<左,右> ("副表实体在主表主体中的属性名",连接方式)
Join<A,B> join = root.join("b", JoinType.LEFT);
//将连接表需要查询的字段写入
orlist.add(cb.like(join.get("post").as(String.class),"%"+key+"%"));
}
return cb.or(orlist.toArray(new Predicate[orlist.size()]));
}
};
通过@Query(value=“sql语句”)方式实现表关联查询
创建ARepository接口然后继承JpaRepository和JpaSpecificationExecutor,然后在repository接口中编写查询方法,如下
public interface ARepository extends JpaRepository<A,String> , JpaSpecificationExecutor<A> {
@Query(value="SELECT * " +
"FROM A_table a " +
"LEFT JOIN B_table b ON a.b_unid = " +
"LEFT JOIN C_table c ON a.c_unid = " +
"WHERE a.delete_flag = 0 " +
"AND (?1 is null or ?1='' or a.b_unid = ?1 )" +
"AND (?2 is null or ?2='' or a.c_unid = ?2 ) " +
"AND (?3 is null or ?3='' or a.created_time >= ?3 ) " +
"ORDER BY fqcm.created_time DESC",nativeQuery = true)
List<Map> selectABC(String bUnid, String cUnid, String createdTimeStart);
}
@Query中?!,?2,?3代表传递的参数,应和下边方法中的参数顺序保持一致,其中条件
AND (?1 is null or ?1='' or a.b_unid = ?1 )
表示参数如果为空字符串或者null时条件不生效,不为空字符串和null时条件生效。
nativeQuery = true 表示可以执行原生的sql语句。
结束语
以上是自己在做jpa多表关联是使用的方法,做一下记录。