最近部门同事在开发统一数据服务层,了解到其底层使用到了QueryDSL,于是花了几个小时在网上看了一下资料,写了一个小例子,供大家参考;
QueryDSL介绍
- QueryDSL仅仅是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查询。
- Querydsl可以通过一组通用的查询API为用户构建出适合不同类型ORM框架或者是SQL的查询语句,也就是说QueryDSL是基于各种ORM框架以及SQL之上的一个通用的查询框架。
- 借助QueryDSL可以在任何支持的ORM框架或者SQL平台上以一种通用的API方式来构建查询。目前QueryDSL支持的平台包括JPA,JDO,SQL,Java Collections,RDF,Lucene,Hibernate Search。
不多介绍了,有兴趣的可以直接上官网:http://www.querydsl.com/
示例代码
1、根据数据库schema,创建QModel:
/**
* QMember is a Querydsl query type for QMember
*/
@Schema("PUBLIC")
@Table("MEMBER")
public class QMember extends RelationalPathBase<QMember> {
private static final long serialVersionUID = 448912875;
public static final QMember member = new QMember("MEMBER");
public final StringPath address = createString("ADDRESS");
public final StringPath city = createString("CITY");
public final StringPath country = createString("COUNTRY");
public final StringPath email = createString("EMAIL");
public final StringPath firstName = createString("FIRST_NAME");
public final StringPath lastName = createString("LAST_NAME");
public final StringPath memberId = createString("MEMBER_ID");
public final StringPath password = createString("PASSWORD");
public final StringPath phone = createString("PHONE");
public final PrimaryKey<QMember> memberPk = createPrimaryKey(memberId);
public QMember(String variable){
super(QMember.class, forVariable(variable));
}
public QMember(BeanPath<? extends QMember> entity){
super(entity.getType(), entity.getMetadata());
}
public QMember(PathMetadata<?> metadata){
super(QMember.class, metadata);
}
}
2、根据生成出来的QModel来查询数据:
private static void queryFromDsl(Connection conn) {
QMember qm = QMember.member;
SQLTemplates dialect = new HSQLDBTemplates();
SQLQuery query = new SQLQueryImpl(conn, dialect);
List<String> lastNames = query.from(qm).list(qm.lastName);
// select last_name from member
System.out.println(lastNames);
SQLQuery query2 = new SQLQueryImpl(conn, dialect);
System.out.println(query2.from(qm).count());
// select count(*) from member
SQLQuery query3 = new SQLQueryImpl(conn, dialect);
List<Object[]> results = query3.from(qm).orderBy(qm.lastName.desc()).list(qm.firstName, qm.lastName);
for (Object[] o : results) {
System.out.println(ToStringBuilder.reflectionToString(o, ToStringStyle.SIMPLE_STYLE));
}
// select first_name, last_name from member order by last_name desc
SQLQuery query4 = new SQLQueryImpl(conn, dialect);
List<Object[]> members = query4.from(qm).where(qm.lastName.like("last%")).list(qm.all());
for (Object[] o : members) {
System.out.println(ToStringBuilder.reflectionToString(o, ToStringStyle.SIMPLE_STYLE));
}
// select * from member where last_name like 'last%'
}
注意到上面注释的部分,分别对应的是相应查询代码的SQL语句,流式查询语句写起来很爽啊!
更多要做的事情
目前只是写了个很简单的例子,体会了一下它的功能,要大范围使用,需要更深入的研究一下;
另外,可能大家已经想到:
- QueryDSL只是通用的查询框架,不支持写操作
- 查询出来的结果是List,我们不得不做额外的工作将它转化为领域实体
以上两点也正是统一数据服务层要解决的问题!
有兴趣的同学,可以下载附件示例代码!
分享到:
相关推荐
Querydsl 能够诞生, 是因为需要在类型安全的方式下进行HQL查询。 构造的HQL查 询需要拼接字符串, 并且会导致代码难以阅读。 通过纯字符串对领域类型和属性的 不安全引用是基于字符串构建HQL的另一个问题。 随着...
Querydsl是一个Java开源框架用于构建类型安全的SQL查询语句。它采用API代替拼凑字符串来构造查询语句。可跟 Hibernate 和 JPA 等框架结合使用。 Querydsl API文档,标准接口使用例
springdata-jpa-querydsl
压缩包里面有两个jar,queyrdsl-jpa-3.7.4.jar、querydsl-apt-3.7.4.jar
Querydsl 是一个能使用静态类型构建类似于SQL的查询的框架。Querydsl 通过流 畅的API调用来构建原本需要用字符串连接或外部XML文件配置的查询....
querydsl中文文档,旨在帮助使用QueryDSL的开发程序人员使用
springData使用queryDsl,详细看http://blog.csdn.net/xiejx618/article/details/51480265
学习queryDsl最好的教材,掌握第一手资料,大家一起进步啊
querydsl-zh_CN.pdf
springboot2.x整合querydsl4.3.1例子
Querydsl是一个Java开源框架用于构建类型安全的SQL查询语句。它采用API代替拼凑字符串来构造查询语句。可跟 Hibernate 和 JPA 等框架结合使用。 基本查询: JPAQuery query = new JPAQuery(entityManager); ...
springmvc +shiro+querydsl+jpa框架多数据源配置详细说明,文档包含详细配置说明,测试通过
querydsl
spring-boot-jpa-querydsl 整合源码
jbosscc-javaee6-modular-ear-archetype.zip,maven原型生成基于java ee 6的模块化项目框架。
博客地址:https://blog.csdn.net/qq_36537546/article/details/95315040
jquery-toastmessage-plugin.zip,用于创建类似android的toast messages的jquery插件
robovm-jfx78-compat.zip,这是一个JDK类库,OpenJFx8的后台端口需要在Java7上运行。