成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

在Spring Data JPA中引入Querydsl的實現(xiàn)方式

瀏覽:62日期:2023-07-24 11:10:55
一、環(huán)境說明

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

二、具體配置

1、在pom.xml中,引入相關(guān)包和配置插件。

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

<!-- Querydsl相關(guān)包 --> <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、設(shè)置源文件夾

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

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

在Spring Data JPA中引入Querydsl的實現(xiàn)方式

3、dao中繼承接口QueryDslPredicateExecutor

在Spring Data JPA中引入Querydsl的實現(xiàn)方式

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

在Spring Data JPA中引入Querydsl的實現(xiàn)方式

三、寫在最后

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

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

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

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

實踐步驟:

1.創(chuàng)建user與depart表,使用外鍵進行關(guān)聯(lián),并插入一些模擬數(shù)據(jù)。

在Spring Data JPA中引入Querydsl的實現(xiàn)方式

2.創(chuàng)建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>節(jié)點下加入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.生成相關(guān)entity與repository對象,這里以user為例:

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

5.生成業(yè)務(wù)傳輸對象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.生成業(yè)務(wù)傳輸對象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.創(chuàng)建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進行查詢,并直接轉(zhuǎn)換需要的屬性至DTO。并且代碼中的pre是可以根據(jù)參數(shù)動態(tài)拼接的。

7.測試結(jié)果:

在Spring Data JPA中引入Querydsl的實現(xiàn)方式

這是查詢?nèi)罩荆?/p>

在Spring Data JPA中引入Querydsl的實現(xiàn)方式

完。

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

標(biāo)簽: Spring
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
在线亚洲免费视频| 在线看国产一区| 久久成人精品| 国产偷v国产偷v亚洲高清| 国产美女一区二区| 欧美色倩网站大全免费| 日韩精品色哟哟| 亚洲欧美视频| 亚洲精品国产一区二区三区四区在线| 欧美日韩高清免费| 久久精品亚洲精品国产欧美| 成人午夜视频福利| 日韩一区二区三区视频在线观看| 国产一区二区在线观看免费| 欧美日韩免费电影| 蜜桃一区二区三区四区| 久久久久一区| 午夜电影一区二区三区| 亚洲综合三区| 中文字幕在线不卡一区| 91猫先生在线| 久久综合九色综合欧美就去吻| 成人免费视频视频在线观看免费| 91精品欧美一区二区三区综合在| 久久不见久久见免费视频7| 欧美午夜电影网| 久久狠狠亚洲综合| 精品视频999| 久久精品国产**网站演员| 欧美性受xxxx| 国产专区欧美精品| 制服丝袜激情欧洲亚洲| 国产大陆亚洲精品国产| 欧美电影免费观看高清完整版| 精品一区二区免费在线观看| 欧美日韩一区二区电影| 国产在线播放一区二区三区| 欧美午夜寂寞影院| 国产一区二区免费视频| 日韩一区二区免费在线电影 | 一区二区三区中文字幕| 国产精品乱码| 午夜视频一区在线观看| 91久久一区二区| 国产一区中文字幕| 精品三级在线看| 欧美久久成人| 国产精品第一页第二页第三页| 99成人在线| 日韩av中文字幕一区二区三区| 欧美精品三级在线观看| www.欧美色图| 中文字幕在线不卡| 久久久久久亚洲精品不卡4k岛国| 麻豆国产精品777777在线| 欧美成人精品福利| 狠狠综合久久| 五月激情六月综合| 777色狠狠一区二区三区| 99亚偷拍自图区亚洲| 1000部国产精品成人观看| 久久亚洲美女| 国产成人免费视频一区| 国产日产欧美一区二区视频| 国产日韩高清一区二区三区在线| 青青草原综合久久大伊人精品优势| 欧美一区二区福利视频| 色综合中文字幕国产| 一区二区三区成人| 欧美日韩中文国产| 91看片淫黄大片一级在线观看| 亚洲精品国产精华液| 欧洲精品在线观看| 9久草视频在线视频精品| 亚洲精品成人a在线观看| 欧美色精品在线视频| 91热门视频在线观看| 亚洲免费色视频| 欧美午夜精品电影| 欧美三级第一页| 日韩av中文字幕一区二区| 欧美精品一区二区三区在线播放 | 中文精品视频一区二区在线观看| 人禽交欧美网站| 欧美精品一区二区久久婷婷| 亚洲欧美日韩综合一区| 成人h版在线观看| 亚洲一区二区在线免费看| 日韩限制级电影在线观看| 亚洲网站啪啪| 久久精品国产在热久久| 欧美国产精品一区二区三区| 久久只有精品| 欧美freesex交免费视频| 日韩国产精品久久久| 国产清纯白嫩初高生在线观看91| 老色鬼久久亚洲一区二区| 99麻豆久久久国产精品免费优播| 亚洲一区二区三区视频在线| 欧美sm极限捆绑bd| 亚洲欧美清纯在线制服| 成人av网站在线| 亚洲一区国产视频| 精品国产青草久久久久福利| 午夜在线a亚洲v天堂网2018| av电影一区二区| 日韩国产在线观看| 中文天堂在线一区| 欧美日韩卡一卡二| 在线亚洲精品| 91免费视频网| 日韩av在线发布| 国产精品国产精品国产专区不蜜| 欧美日韩国产高清一区二区| 亚洲日本欧美在线| 成人精品电影在线观看| 亚洲va在线va天堂| 久久久久国产成人精品亚洲午夜| 久久精选视频| 在线欧美不卡| 成人av片在线观看| 蜜桃一区二区三区在线观看| 亚洲精品美腿丝袜| 久久久久久久国产精品影院| 在线播放国产精品二区一二区四区 | 亚洲高清视频在线观看| 国产精品一品二品| 午夜精品一区二区三区免费视频| 亚洲国产精品成人综合 | 亚洲综合色区另类av| 26uuu国产一区二区三区| 欧美三级在线播放| 亚洲一区二区免费看| 欧美色综合网| 高清久久久久久| 欧美a一区二区| 亚洲综合一区二区三区| 国产欧美精品一区aⅴ影院| 欧美精品xxxxbbbb| 久久综合亚州| 99精品热视频只有精品10| 91同城在线观看| 国产乱人伦精品一区二区在线观看| 一区二区三区日韩欧美| 日韩一区二区三区免费观看| 在线观看91视频| 亚洲一区亚洲| 激情亚洲成人| 99在线精品免费| 丁香一区二区三区| 国产精品一区二区在线看| 精品一区二区精品| 日韩av电影天堂| 亚洲一区电影777| 最近中文字幕一区二区三区| 久久综合给合久久狠狠狠97色69| 91精品国产一区二区三区蜜臀 | 亚洲精品一线二线三线无人区| 欧美日韩成人在线一区| 色婷婷综合久久久久中文| 国产精品区一区| 日韩一级网站| 黄色在线成人| 激情综合亚洲| 国产一区二区三区四区三区四| 成人av手机在线观看| 国产成a人亚洲精| 国产精品影视天天线| 国内精品在线播放| 精品中文字幕一区二区| 欧美aaa在线| 日本免费新一区视频| 丝袜亚洲另类欧美| 天天综合色天天综合色h| 亚洲动漫第一页| 亚洲国产一区二区视频| 亚洲图片有声小说| 亚洲高清免费视频| 婷婷六月综合亚洲| 日本网站在线观看一区二区三区 | 成人小视频免费在线观看| 成人永久免费视频| 国产成人综合亚洲91猫咪| 国产91丝袜在线播放九色| 国产精品1区2区| 国产99精品国产| 91在线视频网址| 欧美日韩喷水| 欧美亚韩一区| 亚洲激情社区| 国产伦精品一区二区三区视频孕妇| 成人一区二区三区| eeuss影院一区二区三区| 91麻豆国产在线观看| 欧美日韩在线一区二区三区| 亚洲第一黄网| 亚欧美中日韩视频| 一本久久综合亚洲鲁鲁五月天| 久色成人在线| 欧美精品久久99|