读书人

QueryDSL学习札记

发布时间: 2012-07-30 16:19:05 作者: rapoo

QueryDSL学习笔记

最近部门同事在开发统一数据服务层,了解到其底层使用到了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);    }}
?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 memberSystem.out.println(lastNames);SQLQuery query2 = new SQLQueryImpl(conn, dialect);System.out.println(query2.from(qm).count());// select count(*) from memberSQLQuery 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 descSQLQuery 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,我们不得不做额外的工作将它转化为领域实体

以上两点也正是统一数据服务层要解决的问题!

?

有兴趣的同学,可以下载附件示例代码!

读书人网 >软件架构设计

热点推荐