该文章旨在记录工作过程使用QueryDSL的一些体验以及心得;
废话不说,直接进入主题,要想使用QueryDSL首先我们需要加入依赖;
如下所示:
针对Maven集成;
com.querydsl
querydsl-apt
${querydsl.version}
provided
com.querydsl
querydsl-jpa
${querydsl.version}
org.slf4j
slf4j-log4j12
1.6.1
然后我们来配置maven APT插件
com.mysema.maven
apt-maven-plugin
1.1.3
process
target/generated-sources/java
com.querydsl.apt.jpa.JPAAnnotationProcessor
JPAAnnotationProcessor 查找带有 javax.persistence.Entity 注解的领域类型并为其生成查询类型。 如果你在领域类型中使用的是Hibernate的注解, 那应该使用 APT 处理器com.querydsl.apt.hibernate.HibernateAnnotationProcessor 来代替
JPAAnnotationProcessor 。运行 clean install 命令后, 在 target/generated-sources/java 目录下将生成相应的查询类型。
如果你使用Eclipse, 运行 mvn eclipse:eclipse 更新你的Eclipse项目, 将target/generated-sources/java 作为源目录。
接下来,我们创建一个实体类;
@Entity
public class Customer {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
} p
ublic String getLastName() {
return lastName;
} p
ublic void setFirstName(String fn) {
firstName = fn;
} p
ublic void setLastName(String ln)[
lastName = ln;
}
}
Querydsl 会在 Customer 类的同一个包内生成一个名称为 QCustomer 的查询类。 QCustomer 的静态实例变量可在Querydsl查询中作为 Customer 类的代表。
QCustomer 有一个默认的静态实例变量:QCustomer customer = QCustomer.customer;
或者你可以像下面列子一样定义查询类实例变量:
QCustomer customer = new QCustomer("myCustomer");
2. 查询
Querydsl JPA 模块同时支持 JPA 和 Hibernate API
当使用 JPA 时, 需要用到 JPAQuery 实例, 就像下面的例子:
// where entityManager is a JPA EntityManager
JPAQuery> query = new JPAQuery(entityManager);
如是你使用的是 Hibernate API, 你可以实例化一个 HibernateQuery :
// where session is a Hibernate session
HibernateQuery> query = new HibernateQuery(session);
JPAQuery 和 HibernateQuery 都实现了 JPQLQuery 这个接口。
构造一个获取名字为 "Bob" 的一个 customer 的信息的查询:
// queryFactory => JPAQueryFactory
QCustomer customer = QCustomer.customer;
Customer bob = queryFactory.selectFrom(customer)
.where(customer.firstName.eq("Bob"))
.fetchOne();
调用 selectFrom 方法是定义查询的来源与映射, where 则定义查询的过滤
器, fetchOne 则要告诉 Querydsl 返回单个元素( SQLQuery> 中的泛型指定
元素类型) 。
一般用法
JPQLQuery 接口可以进行级联调用的方法说明:
select : 设置查询的映射(如果由查询工厂创建查询, 则不需要调用)
from : 添加查询的源(表)
innerJoin, join, leftJoin, rightJoin, on : 使用这些方法添加要 join
的元素。 连接方法的第一个参数是要连接的源, 第二个参数是源目标(别名) 。
where : 添加查询过滤器, 以逗号分隔的可变参数传入, 或是使用 and 或 or
操作连接。
groupBy : 以可变参数形式添加查询的分组。
having : 添加具有 "GROUP BY" 分组作为断言( Predicate ) 表达式的可变
参数数组的 HAVING 过滤器
orderBy : 添加结果的排序方式的排序表达式。 使用 asc() 和 desc() 方法
获取基于数字、 字符串或其他可进行比较的表达式的 OrderSpecifier 实例
limit, offset, restrict : 设置分页查询的结果。 limit 为结果的最大行
数, offset 是偏移的行数, restrict 则是两者的限定约束
QDepartment department = QDepartment.department;
QDepartment d = new QDepartment("d");
queryFactory.selectFrom(department)
.where(department.size.eq(
JPAExpressions.select(d.size.max()).from(d)))
.fetch();
其他的增删改查就不贴了,大同小异;
如果看不懂的话请移步我的资源,我把该资源的文档上传了;