- 内容提要
- 序
- 前言
- 第一部分 背景知识
- 第 1 章 Spring Data 项目
- 第 2 章 Repository:便利的数据访问层
- 第 3 章 使用 Querydsl 实现类型安全的查询
- 第二部分 关系型数据库
- 第 4 章 JPA Repository
- 第 5 章 借助 Querydsl SQL 实现类型安全的 JDBC 编程
- 第三部分 NoSQL
- 第 6 章 MongoDB: 文档存储
- 第 7 章 Neo4j:图数据库
- 第 8 章 Redis:键/值存储
- 第四部分 快速应用开发
- 第 9 章 使用 Spring Roo 实现持久层
- 第 10 章 REST Repository 导出器
- 第五部分 大数据
- 第 11 章 Spring for Apache Hadoop
- 第 12 章 使用 Hadoop 分析数据
- 第 13 章 使用 Spring Batch 和 Spring Integration 创建大数据管道
- 第六部分 数据网格
- 第 14 章 分布式数据网格:GemFire
- 关于封面
3.2 生成查询元模型
正如在前文中所见,Querydsl 的核心构件(artifact)就是查询元模型类。这些类是通过注解处理工具集(APT,Annotation Processing Toolkit,见 http://www.jcp.org/ en/jsr/detail?id=175 )生成的,它是 Java 6 中 javac Java 编译器的一部分。APT 有一种机制,能够以编码的方式探查已有的 Java 源代码以查找特定的注解,然后再回过头来调用函数以生成 Java 代码。Querydsl 使用了这种机制来提供特定的 APT 处理器实现类,这个类可以用于探查注解。示例 3-1 使用了 Querydsl 特定的注解,如 @QueryEntity 以及 @QueryEmbeddable。如果我们已经拥有了某种存储类型的映射领域类,而这种存储类型是 Querydsl 所能够支持的,那么生成元模型类并不需要额外的过程。在这里的核心集成点在于需要将注解处理器传递给 Querydsl APT。通常处理器会在构建过程中执行。
3.2.1 构建系统集成
为了与 Maven 集成,Querydsl 提供了 maven-apt-plugin 插件,借助它就能够配置实际使用的处理器类了。在示例 3-8 中,将 process 的目标设置为 generate-source 阶段,这样所配置的处理器类就能探查 src/main/java 目录下的类。如果想要为测试源码包(src/test/java)中的类生成元模型类的话,需要在 generate-test-sources 阶段执行 test-process 目标。
示例 3-8 设置 Maven APT 插件
3.2.2 所支持的注解处理器
Querydsl 自带了各种 APT 处理器,以用于探查不同的注解并生成对应的元模型类。
QuerydslAnnotationProcessor
非常核心的注解处理器,会探查 Querydsl 的特定注解,如 @QueryEntity 和 @QueryEmbeddable。
JPAAnnotationProcessor
用于探查 javax.persistence 注解,如 @Entity 以及 @Embeddable 。
HibernateAnnotationProcessor
类似于 JPA 处理器,但是增加了对 Hibernate 注解的支持。
JDOAnnotationProcessor
探查 JDO 注解,如 @PersistenceCapable 和 @EmbeddedOnly 。
MongoAnnotationProcessor
Spring Data 的一个专用的处理器,会探查 @Document 注解。阅读 6.3 小节“映射模块”以了解更多信息。
3.2.3 使用 Querydsl 对存储进行查询
现在查询类已经就绪了,让我们看一下如何实际使用它们构建与特定存储相关的查询。正如前面所提到的,Querydsl 为各种存储都提供了集成模块,这些模块以优雅且一致的 API 来创建查询对象、通过所生成的元模型类进行断言定义并执行最终的查询。
例如,JPA 模块提供了一个 JPAQuery 实现类,它会接受 EntityManager 并提供了 API 能够实现在执行之前应用断言,如示例 3-9 所示。
示例 3-9 使用 Querydsl JPA 模块来查询关系型存储
如果还记得示例 3-6 的话,就会发现这两个代码片段看上去区别并不大。实际上,唯一的区别在于我们采用 JPAQuery 作为基础,而前面的示例使用是集合包装类(Collection Wrapper)。为 MongoDB 存储实现相同的场景同样也没有太大的变化,对于这一点你应该不会感到太惊讶(如示例 3-10 所示)。
示例 3-10 联合使用 Querydsl MongoDB 模块以及 Spring Data MongoDB
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论