天天看點

SpringDataJPA+QueryDSL聯合查詢

SpringDataJPA+QueryDSL聯合查詢

最近在研究SpringDataJPA和QueryDSL,以前都是各寫各的,沒有想到這兩個還能聯合适用,試了試,記錄一下。

先寫出兩種方式各自的查詢:

1,SpringDataJPA

根據名稱和類型查詢,但是不能模糊查詢

dao

package com.common.dao;

import com.cecft.common.entity.Org;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface OrgDao extends JpaSpecificationExecutor<Org>, JpaRepository<Org, String>, PagingAndSortingRepository<Org, String>{
    List<Org> findByNameAndType(String name, Integer type);
}
           

service

public List<Org> findByNameAndType (String name, Integer type) {
        List<Org> list = orgDao.findByNameAndType(name,type);
        return list;
}
           
2,QueryDSL

可以模糊查詢,但是代碼量不少哈

service

public List<Org> findByNameAndType (String name, Integer type) {
        QOrg qOrg = QOrg.org;
        BooleanBuilder builder = new BooleanBuilder();
        if (StringUtils.isNotBlank(name)) {
            builder.and(qOrg.name.like("%"+name+"%"));
        }
        if (type != null) {
            builder.and(qOrg.type.eq(type));
        }
        JPAQuery<Org> query = queryFactory.select(qOrg).from(qOrg).where(builder).orderBy(qOrg.updateTime.desc());

        QueryResults<Org> fetchResults = query.fetchResults();
        List<Org> list = fetchResults.getResults();
        return list;
    }
           
3,聯合查詢

dao

package com.common.dao;

import com.cecft.common.entity.Org;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface OrgDao extends JpaSpecificationExecutor<Org>, JpaRepository<Org, String>, PagingAndSortingRepository<Org, String>, QuerydslPredicateExecutor<Org> {

}
           

dao中繼承了QuerydslPredicateExecutor

注意:
	我開始用的是QueryDslPredicateExecutor,但是報錯:Cannot resolve symbol 'QueryDslPredicateExecutor',後來百度一下,找不到該對應類,原來是因為我使用的是springBoot2.X,在springBoot2.X之後,該類修改成了QuerydslPredicateExecutor。把這個類名修改成QuerydslPredicateExecutor即可搞定啦。參考文章:
	(https://blog.csdn.net/qq_17351077/article/details/103166260)
           

service

public List<Org> findByNameAndType (String name, Integer type) {
        QOrg qOrg = QOrg.org;
        List<Org> list = (List<Org>) orgDao.findAll(qOrg.name.like("%"+name+"%").and(qOrg.type.eq(1)),qOrg.updateTime.desc());
        return list;
    }
           

測試:

@Test
    public void testOrg() {
        List<Org> list = orgService.findByNameAndType("山東",0);
        if (CollectionUtils.isNotEmpty(list)) {
            System.out.print(list.get(0).getName()+list.get(0).getType());
        }
    }
           

輸出:

Hibernate: 
    select
        org0_.id as id1_83_,
        org0_.create_by as create_b2_83_,
        org0_.create_time as create_t3_83_,
        org0_.del_flag as del_flag4_83_,
        org0_.update_by as update_b5_83_,
        org0_.update_time as update_t6_83_,
        org0_.address as address7_83_,
        org0_.att_id as att_id8_83_,
        org0_.category as category9_83_,
        org0_.code as code10_83_,
        org0_.des as des11_83_,
        org0_.enterprise_info as enterpr12_83_,
        org0_.enterprise_link as enterpr13_83_,
        org0_.legal_person as legal_p14_83_,
        org0_.name as name15_83_,
        org0_.order_num as order_n16_83_,
        org0_.pid as pid17_83_,
        org0_.region_scode1 as region_18_83_,
        org0_.region_scode2 as region_19_83_,
        org0_.region_scode3 as region_20_83_,
        org0_.tel as tel21_83_,
        org0_.type as type22_83_ 
    from
        sys_org org0_ 
    where
        (
            org0_.name like ? escape '!'
        ) 
        and org0_.type=? 
    order by
        org0_.update_time desc

山東印刷的部門1
           

繼續閱讀