日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:7日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩免费看片| 亚洲第一精品影视| 丝袜美腿成人在线| 天堂俺去俺来也www久久婷婷| 日韩av午夜在线观看| 日韩av电影一区| 色偷偷偷在线视频播放| 国产剧情一区二区在线观看| 97久久精品| 亚洲ab电影| 日韩精品免费视频一区二区三区 | 欧美aa在线观看| 五月激情久久| 蜜桃成人av| 中文字幕一区日韩精品| 欧美在线黄色| 国产福利资源一区| 亚洲深夜视频| 久久黄色影院| 国产精品美女| 欧美日韩一区二区国产 | 国产极品模特精品一二| 美女网站一区| 欧美三级网址| 日韩精品欧美成人高清一区二区| 狠狠久久伊人| 99成人在线| 日韩精品电影| 久久精品三级| 成人午夜网址| 91精品国产一区二区在线观看| 精品在线播放| 蜜臀a∨国产成人精品| 日韩成人在线看| 国产精品成久久久久| 免费观看久久av| 欧美日本三区| 日韩av免费| 日韩三级视频| 国产农村妇女精品一二区| 日韩一区精品字幕| 精品五月天堂| 日韩在线观看一区二区| 99在线|亚洲一区二区| 日韩欧美精品| 亚洲精品影视| 中文另类视频| 亚洲www啪成人一区二区| 亚洲五月婷婷| 国产精品88久久久久久| 日韩动漫一区| 久久网站免费观看| 欧美天堂一区| 日韩视频中文| 福利片在线一区二区| 四虎成人精品一区二区免费网站| aa亚洲婷婷| 国产日韩一区| 伊人久久视频| 99热国内精品| 日韩在线视频一区二区三区| 久久99影视| 亚洲婷婷丁香| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 红桃视频国产精品| 亚洲免费精品| 国产精品115| 蜜臀国产一区二区三区在线播放 | 日韩电影免费网站| 国产亚洲一区| 久久精品系列| 精品久久久网| 国产精品av久久久久久麻豆网| 日韩一区二区久久| 日韩精品导航| 综合欧美精品| 久久国产人妖系列| av免费不卡国产观看| 日韩美女精品| 午夜影院欧美| 超碰99在线| 国产探花在线精品| 国产免费成人| 蜜桃精品在线| 麻豆精品视频在线| 一区在线免费观看| 99视频一区| 免费精品国产的网站免费观看| 亚洲视频综合| 日本亚州欧洲精品不卡| 不卡在线一区| 综合激情一区| 国产精品午夜av| 亚洲欧美日韩国产| 亚洲狼人精品一区二区三区| 欧美激情日韩| 欧美精品自拍| 成人在线网站| а√天堂8资源中文在线| 欧美精品国产一区| 亚洲免费成人av在线| 欧美大黑bbbbbbbbb在线| 伊人久久视频| 国精品产品一区| 欧美aa在线视频| 欧美日韩精品一区二区三区视频 | 青草综合视频| 蘑菇福利视频一区播放| 午夜国产精品视频| 欧美粗暴jizz性欧美20| 秋霞影视一区二区三区| 色黄视频在线观看| 日韩免费福利视频| 色偷偷色偷偷色偷偷在线视频| 国产中文字幕一区二区三区| 国产精品网在线观看| 日韩二区三区在线观看| 玖玖精品视频| 亚洲视频www| 在线亚洲观看| 国产模特精品视频久久久久| 日韩天堂av| 亚洲一区区二区| 亚洲一区欧美激情| 蜜桃av一区二区在线观看| 国产精品毛片在线| 日韩一区欧美二区| 日韩中文欧美在线| 亚洲一区导航| 欧美日韩午夜| 麻豆精品久久| 日韩综合一区| 91一区二区三区四区| 国产精品成人a在线观看| 国产精品成人a在线观看| 丝袜美腿诱惑一区二区三区| 99热精品久久| 视频在线在亚洲| 婷婷综合国产| 国产精品www.| 日韩欧美一区二区三区在线视频 | 日韩1区2区3区| 国产精品一区二区三区四区在线观看| 欧美亚洲人成在线| 美女免费视频一区| 激情久久一区二区| 成人久久一区| 午夜一区在线| 日本亚洲不卡| 精品一区视频| 999视频精品| 视频在线观看国产精品| 日韩高清一区二区| 久久久久97| 伊人精品一区| 亚洲精品动态| 麻豆成人在线观看| 欧洲亚洲一区二区三区| 老司机久久99久久精品播放免费| 日韩高清不卡一区二区| 国产精品白丝久久av网站| 日韩欧美精品| 久久国产精品亚洲77777| 欧美天堂一区| 日韩欧美网址| 一区二区日韩免费看| 欧美成人精品一级| av一区二区高清| 日韩激情精品| 美女av在线免费看| 日韩制服丝袜av| 久久的色偷偷| 99免费精品| 91免费精品国偷自产在线在线| 不卡专区在线| 国产午夜久久| 欧美片第1页综合| 天堂av在线| 日本一区中文字幕| 亚洲一级少妇| 日韩极品在线观看| 日韩欧美一区二区三区在线观看 | 欧美 日韩 国产一区二区在线视频| 蜜臀久久99精品久久久久久9| 国产videos久久| 好看的av在线不卡观看| 久久久久九九精品影院| 久久国产精品久久w女人spa| 丁香婷婷久久| 日韩高清国产一区在线| 麻豆精品蜜桃| 国产精品麻豆成人av电影艾秋| 999国产精品999久久久久久| 国产九一精品| 免费国产自线拍一欧美视频| 精品黄色一级片| 亚洲精品一区二区在线播放∴| 日韩三区在线| 麻豆免费精品视频| 亚洲精品第一|