Querydsl是一个非常强大的Java查询框架,可以帮助开发者简化和优化数据库查询操作。Querydsl可以让开发者使用Java代码来编写SQL查询,从而避免了字符串拼接带来的错误风险,并提高了代码的可读性和可维护性。其还支持各种高级查询功能,例如连接、子查询、聚合等,并可以生成各种数据库方言的SQL语句。
快速开始
1.引入依赖
1 2 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.配置数据源
1 2 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-8 quarkus.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
即可。
1 2 3 4 5 6 7 8
| public class QueryDslConfig { @Inject EntityManager entityManager;
@Singleton public JPAQueryFactory jpaQueryFactory() { return new JPAQueryFactory(entityManager); } }
|
4.实体类
1 2 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语句基本一致,所以不查阅文档基本也能知道如何写查询条件。
1 2 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
1 2 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
即可
1 2 3 4 5 6 7
| @Singleton public class UserRepository extends Repository<User> { @Override protected EntityPathBase<User> get() { return QUser.user; } }
|
3.使用
1 2 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(); } }
|