日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Springboot之QueryDSL增强JPA操作

發(fā)布時間:2023/12/20 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Springboot之QueryDSL增强JPA操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Springboot使用queryDSL

一、簡介

Querydsl 是一個類型安全的 Java 查詢框架,支持 JPA, JDO, JDBC, Lucene, Hibernate Search 等標(biāo)準(zhǔn)。類型安全(Type safety)和一致性(Consistency)是它設(shè)計的兩大準(zhǔn)則。在 Spring Boot 中可以很好的彌補 JPA 的不靈活,實現(xiàn)更強大的邏輯。

JPA操作多表操作的時候,很麻煩,我們也可以建關(guān)聯(lián)關(guān)系,但是需要維護一對關(guān)系,序列化的問題,JPA的單表操作也很麻煩,不然就得寫SQL語句,一點都不靈活。非常懷念MyBatis-plus,所幸找到了QueryDSL這個Java框架,大大的簡化了JPA查詢的復(fù)雜度。

下面就是一個操作JPA單表復(fù)雜查詢

/*** 組裝條件查詢** @param companyReq* @return*/ private Specification selectCompanyCondition(CompanyReq companyReq) {return new Specification() {@Overridepublic Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) {List<Predicate> predicates = Lists.newArrayList();// 英文簡稱if (!StringUtils.isEmpty(companyReq.getCompanyCode())) {predicates.add(criteriaBuilder.equal(root.get("companyCode"), companyReq.getCompanyCode()));}// 企業(yè)域名if (!StringUtils.isEmpty(companyReq.getCompanyDNS())) {predicates.add(criteriaBuilder.equal(root.get("companyDNS"), companyReq.getCompanyDNS()));}// 英文全稱if (!StringUtils.isEmpty(companyReq.getCompanyFullCode())) {predicates.add(criteriaBuilder.equal(root.get("companyFullCode"), companyReq.getCompanyFullCode()));}// 企業(yè)簡稱if (!StringUtils.isEmpty(companyReq.getCompanyName())) {predicates.add(criteriaBuilder.like(root.get("companyName"), "%" + companyReq.getCompanyName() + "%"));}// 注冊時間 時間段之內(nèi)if ((companyReq.getCreateEndTime() != null) && (companyReq.getCreateStartTime() != null)) {predicates.add(criteriaBuilder.between(root.get("createTime"), companyReq.getCreateStartTime(), companyReq.getCreateEndTime()));}// 按照創(chuàng)建時間排序 默認(rèn)為 不傳該字段 或者 rankType = true 為 降序if (companyReq.getRankType() == null || companyReq.getRankType()) {query.orderBy(criteriaBuilder.desc(root.get("createTime")));} else {query.orderBy(criteriaBuilder.asc(root.get("createTime")));}return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));}}; }

并且在不是很想加關(guān)聯(lián)關(guān)系,但是想做關(guān)聯(lián)查詢。就很無奈了,我并沒有找到好的方法區(qū)處理。QueryDSL就可以很好地處理。下面開始介紹!

二、添加依賴

<dependency><groupId>com.querydsl</groupId><artifactId>querydsl-apt</artifactId><scope>provided</scope> </dependency> <dependency><groupId>com.querydsl</groupId><artifactId>querydsl-jpa</artifactId> </dependency>

三、添加maven插件

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><!-- 插件失敗:將{JAVA_HOME}/lib/tools.jar 復(fù)制到 jre/lib 目錄下 --><!-- 插件如果還是飄紅,無所謂,無視就可以 --><groupId>com.mysema.maven</groupId><artifactId>apt-maven-plugin</artifactId><version>1.1.3</version><executions><execution><phase>generate-sources</phase><goals><goal>process</goal></goals><configuration><!-- 將生成對應(yīng)的實例類的操作類 --><outputDirectory>target/generated-sources</outputDirectory><processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor></configuration></execution></executions></plugin></plugins> </build>

四、添加QueryDSL的配置類

import com.querydsl.jpa.impl.JPAQueryFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;import javax.persistence.EntityManager;/*** @author 墨龍吟* @version 1.0.0* @ClassName QueryDSLConfig.java* @Email 2354713722@qq.com* @Description TODO* @createTime 2019年08月27日 - 19:52*/ @Configuration public class QueryDSLConfig {@Autowiredprivate EntityManager entityManager;@Beanpublic JPAQueryFactory getQueryFactory() {return new JPAQueryFactory(entityManager);}}

五、實例使用

在操作Service類中注入JPAQueryFactory

@Autowired private JPAQueryFactory queryFactory;

然后就可以操作了數(shù)據(jù)表了。

where和orderBy使用:

@Override public List<FileEntity> getAll() {QFileEntity qFileEntity = QFileEntity.fileEntity;return queryFactory.selectFrom(qFileEntity).where(qFileEntity.canView.eq(true)).orderBy(qFileEntity.createTime.desc()).fetch(); }

多表聯(lián)查,返回指定的字段

@Override public List<FileVO> getFileList() {QFileEntity qFileEntity = QFileEntity.fileEntity;QUserEntity qUserEntity = QUserEntity.userEntity;List<FileVO> result = queryFactory.select(Projections.bean(FileVO.class,qFileEntity.fileUrl,qFileEntity.fileName,qFileEntity.fileId,qFileEntity.updateTime,qFileEntity.createTime,qFileEntity.userId,qFileEntity.brief,qUserEntity.userName,qFileEntity.isDefault)).from(qFileEntity).leftJoin(qUserEntity).on(qFileEntity.userId.eq(qUserEntity.userId)).where(qFileEntity.canView.eq(true)).orderBy(qFileEntity.createTime.desc()).fetch();return result; }

直接返回實體類

@Override public List<UserEntity> checkUserInfo(String username) {QUserEntity qUserEntity = QUserEntity.userEntity;return queryFactory.selectFrom(qUserEntity).where(qUserEntity.userName.eq(username).and(qUserEntity.canView.eq(true))).fetch(); }

六、總結(jié)

QueryDSL 操作數(shù)據(jù)表做復(fù)雜查詢是非常棒的。具體細節(jié)到官網(wǎng)查看吧

關(guān)注一個個人微信公眾號吧!感謝!

總結(jié)

以上是生活随笔為你收集整理的Springboot之QueryDSL增强JPA操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。