Spring Data JPA 整合QueryDSL的使用案例
QueryDSL是什么?
QueryDSL 是一個(gè)用于構(gòu)建類型安全的 SQL 查詢的 Java 庫(kù)。它的主要目標(biāo)是簡(jiǎn)化在 Java 中構(gòu)建和執(zhí)行 SQL 查詢的過(guò)程,同時(shí)提供類型安全性和更好的編碼體驗(yàn)。QueryDSL 可以與許多關(guān)系型數(shù)據(jù)庫(kù)一起使用,如 MySQL、PostgreSQL、Oracle 等。QueryDSL 提供了一種以編程方式構(gòu)建查詢的方式,它使用了 Fluent API 風(fēng)格的鏈?zhǔn)秸{(diào)用,使得查詢語(yǔ)句更易讀、易寫(xiě),并且能夠在編譯時(shí)捕獲一些常見(jiàn)的錯(cuò)誤。它還提供了代碼生成工具,可以生成查詢實(shí)體、屬性和查詢類型的元數(shù)據(jù),從而增強(qiáng)了代碼的類型安全性。
- 類型安全性:通過(guò)使用 Java 編程語(yǔ)言,QueryDSL 提供了編譯時(shí)的類型安全性,避免了運(yùn)行時(shí)錯(cuò)誤。
- Fluent API:QueryDSL 的 API 設(shè)計(jì)使得查詢可以使用鏈?zhǔn)秸{(diào)用,提高了代碼的可讀性。
- 支持多種查詢類型:QueryDSL 支持查詢、更新和刪除操作,并且提供了豐富的表達(dá)式操作符和函數(shù)。
- 支持關(guān)聯(lián)查詢:可以在查詢中輕松地處理實(shí)體之間的關(guān)聯(lián)關(guān)系,包括一對(duì)一、一對(duì)多、多對(duì)一和多對(duì)多等。
- 支持 JPA 和 SQL:QueryDSL 可以與 JPA(Java Persistence API)和 SQL 一起使用,適用于不同的持久化框架和數(shù)據(jù)庫(kù)。
- 代碼生成工具:QueryDSL 提供了代碼生成工具,可以生成查詢實(shí)體和屬性的元數(shù)據(jù),幫助提高代碼的可維護(hù)性。
maven配置
<dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>${querydsl.version}</version> <classifier>jakarta</classifier> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> <scope>provided</scope> <classifier>jakarta</classifier> </dependency> <querydsl.version>5.0.0</querydsl.version> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- query dsl build Q Entity --> <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>
需執(zhí)行 maven clean install
配置類
import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author Wang */ @Configuration public class JpaQueryConfig { @Bean public JPAQueryFactory jpaQuery(EntityManager entityManager) { return new JPAQueryFactory(entityManager); } }
使用案例
import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; import com.woodare.cdw.core.Cons; import com.woodare.cdw.jpa.data.SecondaryInvitingData; import com.woodare.cdw.jpa.entity.QAccountEntity; import com.woodare.cdw.jpa.entity.QBoatEntity; import com.woodare.cdw.jpa.entity.QSecondaryInvitingEntity; import com.woodare.cdw.jpa.entity.SecondaryInvitingEntity; import com.woodare.cdw.jpa.enumdata.DeleteStateEnum; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; /** * @author Wang */ @RequiredArgsConstructor @Service public class SecondaryInvitingDsl { final JPAQueryFactory queryFactory; public List<SecondaryInvitingData> findSecondaryInvitingByBoatId(String boatId) { QSecondaryInvitingEntity secondaryInvitingEntity = QSecondaryInvitingEntity.secondaryInvitingEntity; QAccountEntity accountEntity = QAccountEntity.accountEntity; return queryFactory.select( Projections.bean(SecondaryInvitingData.class, secondaryInvitingEntity.id, secondaryInvitingEntity.accountId, secondaryInvitingEntity.secondaryAccountId, secondaryInvitingEntity.status, secondaryInvitingEntity.inviteDate, secondaryInvitingEntity.respondDate, secondaryInvitingEntity.deleteDate, secondaryInvitingEntity.permissions, secondaryInvitingEntity.secondaryFirstName, secondaryInvitingEntity.secondaryLastName, secondaryInvitingEntity.secondaryEmail, secondaryInvitingEntity.deleteBy, accountEntity.avatar )) .from(secondaryInvitingEntity) .leftJoin(accountEntity) .on(secondaryInvitingEntity.secondaryAccountId.eq(accountEntity.id)) .where( secondaryInvitingEntity.boatId.eq(boatId), secondaryInvitingEntity.deleteState.eq(DeleteStateEnum.VALID.getValue()) ) .orderBy(secondaryInvitingEntity.createDate.desc()) .fetch(); } /** * CN 根據(jù)被邀人郵箱查詢邀請(qǐng)記錄, 并關(guān)聯(lián)boatName * * @param secondaryEmail secondaryEmail * @param status status * @return List<SecondaryInvitingData> */ public List<SecondaryInvitingData> findListBySecondaryUser(String secondaryEmail, String status) { QSecondaryInvitingEntity secondaryInvitingEntity = QSecondaryInvitingEntity.secondaryInvitingEntity; QBoatEntity boatEntity = QBoatEntity.boatEntity; return queryFactory.select( Projections.bean(SecondaryInvitingData.class, secondaryInvitingEntity.id, secondaryInvitingEntity.accountId, secondaryInvitingEntity.secondaryAccountId, secondaryInvitingEntity.status, secondaryInvitingEntity.inviteDate, secondaryInvitingEntity.respondDate, secondaryInvitingEntity.deleteDate, secondaryInvitingEntity.permissions, secondaryInvitingEntity.secondaryFirstName, secondaryInvitingEntity.secondaryLastName, secondaryInvitingEntity.secondaryEmail, secondaryInvitingEntity.deleteBy, boatEntity.boatName )) .from(secondaryInvitingEntity) .leftJoin(boatEntity) .on(secondaryInvitingEntity.boatId.eq(boatEntity.id)) .where( secondaryInvitingEntity.secondaryEmail.eq(secondaryEmail), secondaryInvitingEntity.status.eq(status), secondaryInvitingEntity.deleteState.eq(DeleteStateEnum.VALID.getValue()), boatEntity.deleteState.eq(DeleteStateEnum.VALID.getValue()) ) .orderBy(secondaryInvitingEntity.createDate.desc()) .fetch(); } /** * CN 根據(jù)被邀人郵箱, 主邀人用戶id查詢邀請(qǐng)記錄, 排除expire狀態(tài) * * @param secondaryEmail secondaryEmail * @param accountId accountId * @return List<SecondaryInvitingData> */ public List<SecondaryInvitingEntity> findListBySecondaryEmailAndAccountId(String secondaryEmail, String accountId) { QSecondaryInvitingEntity secondaryInvitingEntity = QSecondaryInvitingEntity.secondaryInvitingEntity; return queryFactory.select(secondaryInvitingEntity) .from(secondaryInvitingEntity) .where( secondaryInvitingEntity.secondaryEmail.eq(secondaryEmail), secondaryInvitingEntity.accountId.eq(accountId), secondaryInvitingEntity.status.ne(Cons.InvitingStatus.EXPIRED) ) .orderBy(secondaryInvitingEntity.createDate.desc()) .fetch(); } }
import cn.hutool.core.util.StrUtil; import com.querydsl.core.BooleanBuilder; import com.querydsl.jpa.impl.JPAQueryFactory; import com.woodare.cdw.jpa.entity.QSensorSortEntity; import com.woodare.cdw.jpa.entity.SensorSortEntity; import com.woodare.cdw.jpa.enumdata.DeleteStateEnum; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; /** * @author Wang */ @RequiredArgsConstructor @Service public class SensorSortDsl { final JPAQueryFactory queryFactory; public List<SensorSortEntity> findSensorSortList(String sirenDeviceId) { QSensorSortEntity sensorSortEntity = QSensorSortEntity.sensorSortEntity; return queryFactory.selectFrom(sensorSortEntity) .where( sensorSortEntity.sirenDeviceId.eq(sirenDeviceId) ) .orderBy(sensorSortEntity.parentType.asc(), sensorSortEntity.childrenType.desc()) .fetch(); } public void deleteByParam(String sirenDeviceId, String parentType, String childrenType) { QSensorSortEntity sensorSortEntity = QSensorSortEntity.sensorSortEntity; BooleanBuilder condition = new BooleanBuilder(); if (StrUtil.isNotBlank(sirenDeviceId)) { condition.and(sensorSortEntity.sirenDeviceId.eq(sirenDeviceId)); } if (StrUtil.isNotBlank(parentType)) { condition.and(sensorSortEntity.parentType.eq(parentType)); } if (StrUtil.isNotBlank(childrenType)) { condition.and(sensorSortEntity.childrenType.eq(childrenType)); } queryFactory.update(sensorSortEntity) .set(sensorSortEntity.deleteState, DeleteStateEnum.DELETE.getValue()) .where(condition) .execute(); } }
到此這篇關(guān)于Spring Data JPA 整合QueryDSL的文章就介紹到這了,更多相關(guān)Spring Data JPA 整合QueryDSL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
啟動(dòng)Springboot項(xiàng)目時(shí)找不到Mapper的問(wèn)題及解決
這篇文章主要介紹了啟動(dòng)Springboot項(xiàng)目時(shí)找不到Mapper的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Java?web開(kāi)發(fā)環(huán)境的搭建超完整步驟
這篇文章主要介紹了如何安裝和配置IDEA?2020.1.1?X64版本軟件,包括創(chuàng)建Java?Web項(xiàng)目、配置Tomcat、部署Tomcat?API以及創(chuàng)建和配置Servlet,通過(guò)這些步驟,新手可以快速搭建起Javaweb開(kāi)發(fā)環(huán)境,需要的朋友可以參考下2024-11-11Java中@DateTimeFormat注解與@JsonFormat注解的使用方式
這篇文章主要介紹了Java中@DateTimeFormat注解與@JsonFormat注解的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08解決springboot項(xiàng)目上傳文件出現(xiàn)臨時(shí)文件目錄為空的問(wèn)題
這篇文章主要介紹了解決springboot項(xiàng)目上傳文件出現(xiàn)臨時(shí)文件目錄為空的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Java中的== 和equals()方法詳解與實(shí)例
本篇文章介紹了,在java中"==" 與equals方法的使用及其實(shí)例,需要的朋友可以參考下2017-04-04使用SpringBoot簡(jiǎn)單了解Druid的監(jiān)控系統(tǒng)的配置方法
這篇文章主要介紹了使用SpringBoot簡(jiǎn)單了解Druid的監(jiān)控系統(tǒng)的配置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Spring @Value如何通過(guò)${}、#{}注入不同類型的值
這篇文章主要介紹了Spring @Value如何通過(guò)${}、#{}注入不同類型的值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05