javascript
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 实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树的存储结构(树的二叉链表(孩子—兄弟)
- 下一篇: MarkdownPad在win10安装不