jpa多表关联条件查询实现

时间:2025-03-10 07:45:39

通过实体类映射实现多表关联条件查询

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多表关联是使用的方法,做一下记录。