我正在考虑使用Spring-Data + QueryDSL + JDBC来替换(或增强)当前使用的MyBatis。
我的理由是:Spring-Data + QueryDSL + JDBC:如何将查询结果映射到域对象?
- 列名的编译时间检查 SQL tatements和IDE自动完成
- 能力写在Java集合单元测试针对同一代码的
- 编译时间检查将工作与实际分贝,这比简单得多,更快的预填充一个DB
- 它比MyBatis的更简洁 - 无需单独XxxMapper.java和XxxMapper.xml的DAO信用证项下艾尔
然而,我看到以下问题:
- 没有为查询结果映射到域对象没有基础设施。 QueryDSL的QBean和MappingProjection,Spring的BeanPropertyRowMapper和Spring Data的OneToManyResultSetExtractor似乎太低级,见下文。
- 没有开箱会话/事务级缓存的这MyBatis的免费的午餐
- 没有开箱的SQL语句和结果记录这MyBatis的
免费的午餐因为我问了的单个问题让我们专注于我认为最重要的问题的映射。
所以我的问题是:
是否有任何方便的解决方案将QueryDSL的SQLQuery结果映射到域对象,类似于MyBatis或JPA提供的?也就是说,映射基于一些简单的配置,无论是XML,注释还是简单的Java?
特别地,我对以下内容:
- 映射列到自定义类型,例如字符串列到电子邮件地址 Java对象
- 将一组列映射到嵌入对象,例如,分组{名字,姓氏}成全名 Java对象
- 支持一对多的关系,例如能够以提取含有地址列表的顾客(多个)对象。
总之,我需要一个简单的方法来从下面的SQL查询获得以下 '客户' 类的一个或多个对象:
class Customer {
EmailAddress emailAddress;
FullName fullName;
Set<Address> addresses;
Set<Comment> selfDescription;
}
class EmailAddress {
private String address;
EmailAddress(String address) {this.address = address; }
}
class FullName {
String firstName, lastName;
}
class Address {
String street, town, country;
}
class Comment {
LocalDateTime timeStamp;
String content;
}
查询:
query.from(qCustomer).
leftJoin(qCustomer._addressCustomerRef, qAddress)).
leftJoin(qCustomer._commentCustomerRed).
getResults(
qCustomer.email_address, qCustomer.first_name, qCustomer.last_name,
qAddress.street, qAddress.town, qAddress.country,
qComment.creation_time_stamp, qComment.content);
对我来说,理想的解决方案是重用MyBatis映射基础结构。
另一种映射解决方案或自定义的解决方案也是可以接受的。
注:
如果你显示一个替代我也可以接受“否定”的答案:
- 拥有的易用性和透明度媲美的MyBatis的 - 你总是知道哪些SQL是通过简单地检查执行代码
- 允许在执行SQL代码的完全控制,特别是,可以轻松地编写检索“客户”三种道街方法:无“地址”和“selfDescription”的信息,只是以“地址”,并与所有的字段
- 允许编译时检查您的SQL代码
- 不需要手动编码来自SQL的每个单个域类的映射。
替代应该在例如很好地工作的上方。已经考虑
解决方案:
- MyBatis的 '生成器' 级(http://mybatis.github.io/mybatis-3/statement-builders.html):不够,因为列和表名仍然是字符串,因此它违反了要求(3)
- 春数据+ JPA + QueryDSL:如果您呈现怎样的要求(1)和(2)可以得到满足,如果没有简单的解决方案将提供