QueryDSL-在springboot中使用querydsl

本文介绍如何在SpringBoot项目中集成QueryDsl,并演示了使用QueryDsl进行复杂动态查询的方法,包括配置pom.xml依赖、设置maven插件以及编写查询逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pom.xml添加依赖

<dependencies>
 <!--QueryDsl start==============================-->
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>4.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-sql</artifactId>
            <version>4.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-sql-spring</artifactId>
            <version>4.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-sql-codegen</artifactId>
            <version>4.2.1</version>
            <scope>provided</scope>
        </dependency>
        <!--QueryDsl end================================-->
</dependencies>
<build>
        <finalName>${project.artifactId}</finalName>
            <plugins>
                <!--springboot-maven插件-->
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <!--QueryDsl插件-->
                <plugin>
                    <groupId>com.mysema.maven</groupId>
                    <artifactId>apt-maven-plugin</artifactId>
                    <version>1.1.3</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>process</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>target/generated-sources/java</outputDirectory>
                                <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>

    </build>

通过maven插件获得相应的查询类(Q开头)

idea右侧栏的maven工具点击complie
在这里插入图片描述
在target文件夹下
在这里插入图片描述

使用querydsl动态查询


@Service
public class ItemSearchService {

    @Autowired
    @PersistenceContext
    private EntityManager entityManager;

    //查询工厂实体
    private JPAQueryFactory queryFactory;

    //实例化控制器完成后执行该方法实例化JPAQueryFactory
    @PostConstruct
    public void initFactory(){
        queryFactory =  new JPAQueryFactory(entityManager);
    }
    //查询实体
    QItemEntity QItem = QItemEntity.itemEntity;
    QTypeEntity QType = QTypeEntity.typeEntity;
    QItemTypeEntity QItemType = QItemTypeEntity.itemTypeEntity;


    /**
     * 商品查询中的获取商品列表
     * @param searchForm
     * @return
     */
    public Map searchByItemForm(ItemSearchForm searchForm, Integer pageNumber, Integer pageSize){

        //基本谓语查询条件
        Predicate predicate = QItem.createTime.loe(new Date());
        //时间
        if(searchForm.getStartTime()!=null&&searchForm.getEndTime()!=null){
            predicate = ExpressionUtils.and(predicate,QItem.createTime.between(searchForm.getStartTime(),searchForm.getEndTime()));
        }
        //品牌
        if (StringUtils.isNotBlank(searchForm.getBrand())&&StringUtils.isNotEmpty(searchForm.getBrand())){
            predicate = ExpressionUtils.and(predicate,QItem.brand.eq(searchForm.getBrand()));
        }
        //商品名称
        if (StringUtils.isNotBlank(searchForm.getItemName())&&StringUtils.isNotEmpty(searchForm.getItemName())){
            predicate  = ExpressionUtils.and(predicate,QItem.itemName.like("%"+searchForm.getItemName()+"%"));
        }
        //分类
        if (StringUtils.isNotEmpty(searchForm.getClassName())&&StringUtils.isNotBlank(searchForm.getClassName())){
            predicate = ExpressionUtils.and(predicate,QType.className.eq(searchForm.getClassName()));
        }

        //返回的map
        List<ItemDTO> dtos = queryFactory.select(Projections.bean(ItemDTO.class,QItem.id,QItem.itemName,QItem.price,QType.className,QItem.brand,QItem.isSaled,QItem.createTime))
                                .distinct()
                                .from(QItemType)
                                .leftJoin(QItem).on(QItemType.itemId.eq(QItem.id))
                                .leftJoin(QType).on(QItemType.typeId.eq(QType.id))
                                .where(predicate)
                                .orderBy(QItem.createTime.desc())
                                .offset(pageNumber)
                                .limit(pageSize)
                                .fetch();
        Long count = queryFactory.select(Projections.bean(ItemDTO.class,QItem.id,QItem.itemName,QItem.price,QType.className,QItem.brand,QItem.isSaled,QItem.createTime))
                                    .distinct()
                                    .from(QItemType)
                                    .leftJoin(QItem).on(QItemType.itemId.eq(QItem.id))
                                    .leftJoin(QType).on(QItemType.typeId.eq(QType.id))
                                    .where(predicate)
                                    .orderBy(QItem.createTime.desc())
                                    .fetchCount();
        Map map = returnMap(dtos,count);
        return map;

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值