Querydsl是一个非常强大的Java查询框架,可以帮助开发者简化和优化数据库查询操作。Querydsl可以让开发者使用Java代码来编写SQL查询,从而避免了字符串拼接带来的错误风险,并提高了代码的可读性和可维护性。其还支持各种高级查询功能,例如连接、子查询、聚合等,并可以生成各种数据库方言的SQL语句。
快速开始
1.引入依赖
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | implementation 'io.quarkus:quarkus-hibernate-orm'
 implementation 'io.quarkus:quarkus-jdbc-postgresql'
 
 
 
 
 
 compileOnly 'com.querydsl:querydsl-apt:5.0.0:jakarta'
 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
 annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta'
 annotationProcessor 'jakarta.persistence:jakarta.persistence-api:3.1.0'
 
 | 
2.配置数据源
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | quarkus.datasource.jdbc.url=jdbc:postgresql://192.168.100.100:5432/test?serverTimezone=Asia/Shanghai&characterEncoding=utf-8quarkus.datasource.username=root
 quarkus.datasource.password=root
 
 
 quarkus.hibernate-orm.database.generation=update
 
 
 
 
 %dev.quarkus.log.category."org.hibernate.SQL".min-level=DEBUG
 %dev.quarkus.log.category."org.hibernate.SQL".level=DEBUG
 
 
 
 | 
3.配置类
即使用 hibernate 的 entityManager 构建 JPAQueryFactory 即可。
| 12
 3
 4
 5
 6
 7
 8
 
 | public class QueryDslConfig {@Inject EntityManager entityManager;
 
 @Singleton
 public JPAQueryFactory jpaQueryFactory() {
 return new JPAQueryFactory(entityManager);
 }
 }
 
 | 
4.实体类
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | @Data@Entity
 @Builder
 @AllArgsConstructor
 @NoArgsConstructor
 public class User {
 
 @Id
 @GeneratedValue(strategy=SEQUENCE, generator="CUST_SEQ")
 String id;
 
 String fullName;
 }
 
 | 
5.增删改查
Querydsl 的查询用法和sql语句基本一致,所以不查阅文档基本也能知道如何写查询条件。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 
 | @Path("/user")public class UserResource {
 @Inject JPAQueryFactory jpaQueryFactory;
 @GET
 public void test() {
 
 
 
 jpaQueryFactory.selectFrom(QUser.user)
 .where(QUser.user.id.eq("1"))
 .fetchOne();
 jpaQueryFactory.selectFrom(QUser.user)
 .where(QUser.user.name.like("1"))
 .fetch();
 
 jpaQueryFactory.insert(QUser.user).values(new User()).execute();
 
 
 
 jpaQueryFactory.update(QUser.user)
 .set(QUser.user.name,"zhangsan")
 .where(QUser.user.id.eq("1"))
 .execute();
 
 
 jpaQueryFactory.delete(QUser.user).where(QUser.user.id.eq("1")).execute();
 }
 }
 
 | 
通用 Repository
1.增加 Repository
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 
 | public abstract class Repository<T> {@Inject EntityManager entityManager;
 @Inject JPAQueryFactory jpaQueryFactory;
 
 protected abstract EntityPathBase<T> get();
 
 public JPAQuery<T> select() {
 return jpaQueryFactory.selectFrom(get());
 }
 
 public <R extends T> JPAQuery<R> select(Expression<R> select) {
 return jpaQueryFactory.select(select).from(get());
 }
 
 public JPADeleteClause delete() {
 return jpaQueryFactory.delete(get());
 }
 
 public void persist(T entity) {
 entityManager.persist(entity);
 }
 
 public void persist(List<T> entity) {
 int i = 0;
 for (T t : entity) {
 entityManager.persist(t);
 i++;
 if (i % 1000 == 0) {
 entityManager.flush();
 entityManager.clear();
 }
 }
 if (i % 1000 != 0) {
 entityManager.flush();
 entityManager.clear();
 }
 }
 
 public Page<T> page(Page<?> page, Predicate... where) {
 if (page == null) {
 page = new Page<T>();
 }
 if (page.getCurrent() == 0) {
 page.setCurrent(1);
 }
 if (page.getPageSize() == 0) {
 page.setPageSize(10);
 }
 long count =
 Optional.ofNullable(
 jpaQueryFactory.select(get().count()).from(get()).where(where).fetchOne())
 .orElse(0L);
 var sql =
 jpaQueryFactory
 .select(get())
 .from(get())
 .where(where)
 .offset((page.getCurrent() - 1) * page.getPageSize())
 .limit(page.getPageSize());
 return Page.<T>builder()
 .current(page.getCurrent())
 .pageSize(page.getPageSize())
 .total(count)
 .records(sql.fetch())
 .build();
 }
 
 
 }
 
 | 
2.编写 UserRepository
以 User 为例,其他表也添加相应 xxxRepository 即可
| 12
 3
 4
 5
 6
 7
 
 | @Singletonpublic class UserRepository extends Repository<User> {
 @Override
 protected EntityPathBase<User> get() {
 return QUser.user;
 }
 }
 
 | 
3.使用
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | @Path("/user")class UserResource {
 @Inject
 UserRepository userRepository;
 
 @GET
 @Path("/all")
 @Produces(MediaType.APPLICATION_JSON)
 public List<User> all() {
 return userRepository.select().fetch();
 }
 }
 
 |