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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

querydsl动态 sql_Spring-data-jpa扩展查询 QueryDSL 实践

發布時間:2023/12/20 javascript 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 querydsl动态 sql_Spring-data-jpa扩展查询 QueryDSL 实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

說明: QueryDSL是以函數連接的方式將SQL調用進行拆分,比較spring data jpa中的criteria查詢方法還是簡潔了不少。?(轉載請注明來源:cnblogs coder-fang)

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

實踐步驟:

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

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

com.querydsl

querydsl-jpa

com.querydsl

querydsl-apt

provided

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

com.mysema.maven

apt-maven-plugin

1.1.3

process

target/generated-sources/java

com.querydsl.apt.jpa.JPAAnnotationProcessor

com.querydsl

querydsl-apt

4.1.3

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

packagecom.test.demo.db;//

importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.FetchType;importjavax.persistence.GeneratedValue;import staticjavax.persistence.GenerationType.IDENTITY;importjavax.persistence.Id;importjavax.persistence.JoinColumn;importjavax.persistence.ManyToOne;importjavax.persistence.Table;/*** User generated by hbm2java*/@Entity

@Table(name= "user", catalog = "testdb")public class User implementsjava.io.Serializable {privateInteger id;privateDepartment department;privateString username;publicUser() {

}publicUser(Department department, String username) {this.department =department;this.username =username;

}

@Id

@GeneratedValue(strategy=IDENTITY)

@Column(name= "id", unique = true, nullable = false)publicInteger getId() {return this.id;

}public voidsetId(Integer id) {this.id =id;

}

@ManyToOne(fetch=FetchType.LAZY)

@JoinColumn(name= "fk_depart")publicDepartment getDepartment() {return this.department;

}public voidsetDepartment(Department department) {this.department =department;

}

@Column(name= "username", length = 45)publicString getUsername() {return this.username;

}public voidsetUsername(String username) {this.username =username;

}

}

View Code

packagecom.test.demo.repo;importorg.springframework.data.jpa.repository.JpaRepository;importorg.springframework.data.jpa.repository.JpaSpecificationExecutor;importorg.springframework.data.querydsl.QueryDslPredicateExecutor;importorg.springframework.stereotype.Repository;importcom.test.demo.db.User;

@Repositorypublic interface UserRepository extends QueryDslPredicateExecutor, JpaRepository,JpaSpecificationExecutor{

}

View Code

注意:repository需要繼承?QueryDslPredicateExecutor接口。

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

packagecom.test.demo.controller;importcom.querydsl.core.annotations.QueryProjection;importlombok.Data;

@SuppressWarnings("unused")public @Data classUserDTO {privateString username;privateString departname;

}

6.  創建controller進行測試:

packagecom.test.demo.controller;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.annotation.PostConstruct;importjavax.persistence.EntityManager;importjavax.persistence.PersistenceContext;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importcom.querydsl.core.types.Projections;importcom.querydsl.core.types.dsl.BooleanExpression;importcom.querydsl.jpa.impl.JPAQuery;importcom.querydsl.jpa.impl.JPAQueryFactory;importcom.test.demo.db.QUser;importcom.test.demo.repo.UserRepository;

@RestController

@RequestMapping("/")public classTestController {

@Autowired

UserRepository userRepo;

@Autowired

@PersistenceContext

EntityManager em;privateJPAQueryFactory queryFactory;

@PostConstructpublic voidinit() {

queryFactory= newJPAQueryFactory(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 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 result =query.fetch();

Map map = new HashMap<>();

map.put("total", userRepo.count(pre));

map.put("data", result);returnmap;

}

}

View Code

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

7.  測試結果:

這是查詢日志:

完。

總結

以上是生活随笔為你收集整理的querydsl动态 sql_Spring-data-jpa扩展查询 QueryDSL 实践的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。