电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

在Spring Data JPA中引入Querydsl的實現方式

瀏覽:13日期:2023-07-24 11:10:55
一、環境說明

基礎框架采用Spring Boot、Spring Data JPA、Hibernate。在動態查詢中,有一種方式是采用Querydsl的方式。

二、具體配置

1、在pom.xml中,引入相關包和配置插件。

(1)引入包(注:不需要版本號,Spring Boot 會自動匹配合適的版本)

<!-- Querydsl相關包 --> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> </dependency>

(2)配置插件:主要用來生成“查詢對象”。

<plugin> <groupId>com.mysema.maven</groupId> <artifactId>maven-apt-plugin</artifactId> <version>1.0.4</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources</outputDirectory> <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor> </configuration> </execution> </executions> </plugin>

2、設置源文件夾

經過上面pom.xml的配置后,就在 target/generated-sources 文件夾下面自動生成“查詢對象”。需要將該文件夾設置成“源文件夾”,以便可以將下面的java文件進行編譯使用。

生成的查詢對象,都是在原實體(bo)類的名字前,加上 Q 表示。

在Spring Data JPA中引入Querydsl的實現方式

3、dao中繼承接口QueryDslPredicateExecutor

在Spring Data JPA中引入Querydsl的實現方式

4、在service層使用 Querydsl方式進行是查詢,例如:

在Spring Data JPA中引入Querydsl的實現方式

三、寫在最后

此文僅作為引入Querydsl的筆記,并不代表作者本人推薦使用Querydsl。就實際應用而言,個人更傾向于使用 JPA Criteria 的方式來實現動態查詢,其接口是JpaSpecificationExecutor。

補充:Spring-data-jpa擴展查詢 QueryDSL 實踐

說明: QueryDSL是以函數連接的方式將SQL調用進行拆分,比較spring data jpa中的criteria查詢方法還是簡潔了不少。

用例:通過服務調用,使用querydsl進行查詢并直接返回DTO對象(自定義傳輸對象(根據業務需求),注意區別于Entity)

實踐步驟:

1.創建user與depart表,使用外鍵進行關聯,并插入一些模擬數據。

在Spring Data JPA中引入Querydsl的實現方式

2.創建sprintboot項目,在pom文件中加入以下依賴:

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

3.在pom文件中<build>--><plugins>節點下加入plugin:

<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> <dependencies> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>4.1.3</version> </dependency> </dependencies> </plugin>

4.生成相關entity與repository對象,這里以user為例:

注意:repository需要繼承 QueryDslPredicateExecutor<T>接口。

5.生成業務傳輸對象DTO:

package com.test.demo.db;//import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import static javax.persistence.GenerationType.IDENTITY;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.Table;/** * User generated by hbm2java */@Entity@Table(name = 'user', catalog = 'testdb')public class User implements java.io.Serializable { private Integer id; private Department department; private String username; public User() { } public User(Department department, String username) { this.department = department; this.username = username; } @Id @GeneratedValue(strategy = IDENTITY) @Column(name = 'id', unique = true, nullable = false) public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = 'fk_depart') public Department getDepartment() { return this.department; } public void setDepartment(Department department) { this.department = department; } @Column(name = 'username', length = 45) public String getUsername() { return this.username; } public void setUsername(String username) { this.username = username; }}

package com.test.demo.repo;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.JpaSpecificationExecutor;import org.springframework.data.querydsl.QueryDslPredicateExecutor;import org.springframework.stereotype.Repository;import com.test.demo.db.User;@Repositorypublic interface UserRepository extends QueryDslPredicateExecutor<User>, JpaRepository<User, Integer>,JpaSpecificationExecutor<User>{ }

注意:repository需要繼承 QueryDslPredicateExecutor<T>接口。

5.生成業務傳輸對象DTO:

package com.test.demo.controller;import com.querydsl.core.annotations.QueryProjection;import lombok.Data;@SuppressWarnings('unused')public @Data class UserDTO { private String username; private String departname;}

6.創建controller進行測試:

package com.test.demo.controller;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.annotation.PostConstruct;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import com.querydsl.core.types.Projections;import com.querydsl.core.types.dsl.BooleanExpression;import com.querydsl.jpa.impl.JPAQuery;import com.querydsl.jpa.impl.JPAQueryFactory;import com.test.demo.db.QUser;import com.test.demo.repo.UserRepository;@RestController@RequestMapping('/')public class TestController { @Autowired UserRepository userRepo; @Autowired @PersistenceContext EntityManager em; private JPAQueryFactory queryFactory; @PostConstruct public void init() { queryFactory = new JPAQueryFactory(em); } @RequestMapping('/users') Object getUsers(@RequestParam(value = 'page', required = false, defaultValue = '1') Integer page, @RequestParam(value = 'size', required = false, defaultValue = '10') Integer size, @RequestParam(value = 'name', required = false) String name, @RequestParam(value = 'depart', required = false) String depart) { QUser user = QUser.user; JPAQuery<UserDTO> query = queryFactory .select(Projections.bean(UserDTO.class, user.username, user.department.name.as('departname'))) .from(user); BooleanExpression pre = null; if (name!=null && !name.isEmpty()) { pre = user.username.startsWith(name); } if (depart!=null && !depart.isEmpty()) { pre = user.department.name.startsWith(depart); } query.where(pre); query.limit(size); query.offset((page-1)*size); List<UserDTO> result = query.fetch(); Map<String, Object> map = new HashMap<>(); map.put('total', userRepo.count(pre)); map.put('data', result); return map; }}

注:這里就是使用querydsl進行查詢,并直接轉換需要的屬性至DTO。并且代碼中的pre是可以根據參數動態拼接的。

7.測試結果:

在Spring Data JPA中引入Querydsl的實現方式

這是查詢日志:

在Spring Data JPA中引入Querydsl的實現方式

完。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Spring
相關文章:
主站蜘蛛池模板: 隆众资讯-首页_大宗商品资讯_价格走势_市场行情 | 变色龙PPT-国内原创PPT模板交易平台 - PPT贰零 - 西安聚讯网络科技有限公司 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | atcc网站,sigma试剂价格,肿瘤细胞现货,人结肠癌细胞株购买-南京科佰生物 | 吸污车_吸粪车_抽粪车_电动三轮吸粪车_真空吸污车_高压清洗吸污车-远大汽车制造有限公司 | 空气能采暖,热泵烘干机,空气源热水机组|设备|厂家,东莞高温热泵_正旭新能源 | 智能案卷柜_卷宗柜_钥匙柜_文件流转柜_装备柜_浙江福源智能科技有限公司 | 宜兴紫砂壶知识分享 - 宜兴壶人 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 高压微雾加湿器_工业加湿器_温室喷雾-昌润空气净化设备 | 河南中整光饰机械有限公司-抛光机,去毛刺抛光机,精密镜面抛光机,全自动抛光机械设备 | 质检报告_CE认证_FCC认证_SRRC认证_PSE认证_第三方检测机构-深圳市环测威检测技术有限公司 | 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | 送料机_高速冲床送料机_NC伺服滚轮送料机厂家-东莞市久谐自动化设备有限公司 | 标准光源箱|对色灯箱|色差仪|光泽度仪|涂层测厚仪_HRC大品牌生产厂家 | 泰安办公家具-泰安派格办公用品有限公司 | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 东莞海恒试验仪器设备有限公司 | 喷砂机厂家_自动喷砂机生产_新瑞自动化喷砂除锈设备 | 石英砂矿石色选机_履带辣椒色选机_X光异物检测机-合肥幼狮光电科技 | 成都珞石机械 - 模温机、油温机、油加热器生产厂家 | 深圳市八百通智能技术有限公司官方网站 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 电动高尔夫球车|电动观光车|电动巡逻车|电动越野车厂家-绿友机械集团股份有限公司 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 全温度恒温培养摇床-大容量-立式-远红外二氧化碳培养箱|南荣百科 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 河北码上网络科技|邯郸小程序开发|邯郸微信开发|邯郸网站建设 | 钛板_钛管_钛棒_钛盘管-无锡市盛钛科技有限公司 | B2B网站_B2B免费发布信息网站_B2B企业贸易平台 - 企资网 | 【甲方装饰】合肥工装公司-合肥装修设计公司,专业从事安徽办公室、店面、售楼部、餐饮店、厂房装修设计服务 | 手板-手板模型-手板厂-手板加工-生产厂家,[东莞创域模型] | 嘉兴恒升声级计-湖南衡仪声级计-杭州爱华多功能声级计-上海邦沃仪器设备有限公司 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | 玻璃钢型材-玻璃钢风管-玻璃钢管道,生产厂家-[江苏欧升玻璃钢制造有限公司] | 不锈钢搅拌罐_高速搅拌罐厂家-无锡市凡格德化工装备科技有限公司 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 【ph计】|在线ph计|工业ph计|ph计厂家|ph计价格|酸度计生产厂家_武汉吉尔德科技有限公司 |