当前位置: 首页 > 知识库问答 >
问题:

Spring-Data+QueryDSL+JDBC:如何将查询结果映射到域对象?

姬承教
2023-03-14
    null
  1. 没有将查询结果映射到域对象的基础结构。QueryDSL的QBean和MappingProject、Spring的BeanPropertyRowMapper和Spring-Data的OneToManyResultSetExtractor似乎级别太低,请参见下文。
  2. 没有在MyBatis中免费提供的现成会话/事务级缓存
  3. Mybatis中没有免费提供的现成SQL语句和结果日志

因为我只问一个问题,让我们集中讨论映射,我认为这是最重要的问题。
所以我的问题是:
有没有什么方便的解决方案可以将QueryDSL的SQLQuery结果映射到域对象,类似于MyBatis或JPA提供的方法?也就是说,基于一些简单配置的映射,无论是XML、注释还是简单Java?

我特别感兴趣的是:

  1. 将列映射到自定义类型,例如将字符串列映射到EmailAddress Java对象
  2. 将一组列映射到嵌入对象,例如将{first_name,last_name}分组到全名Java对象
  3. 支持一对多关系,例如能够提取包含地址列表的Customer对象。

总而言之,我需要一种简单的方法,从以下SQL查询中获取以下'Customer'类的一个或多个对象:

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);
    null
  • MyBatis“Builder”类(http://mybatis.github.io/myBatis-3/statement-builders.html):不够,因为列和表名仍然是字符串,因此违反了要求(3)
  • spring-data+JPA+querydsl:如果您展示了如何满足需求(1)和(2)并且不提供更简单的解决方案,则可能是一个选项

共有1个答案

毛缪文
2023-03-14

Lukas Eder在这里给出了一个类似问题的极好答案:是否可能将MyBatis和QueryDSL/Jooq结合在一起?

他对映射问题的回答是使用Java8函数样式功能或专用解决方案(如ModelMapper)。

他还提到Spring JCache支持作为一种缓存解决方案,并将此解决方案应用于日志记录。

 类似资料:
  • 我有一个用户类,有16个属性,比如名字,姓氏,出生日期,用户名,密码等...这些都存储在MySQL数据库中,当我想要检索用户时,我使用ResultSet。我想将每一列映射回用户属性,但我这样做的效率似乎非常低。例如,我正在做: 也就是说,我检索所有的列,然后通过将所有的列值插入用户构造函数来创建用户对象。 有人知道更快、更整洁的方法吗?

  • 问题内容: 我有一个带有本地查询的Spring Data Repository方法 并且我想将结果映射到Non-Entity POJO 。 是否可以,如果可以,请提供示例吗? 问题答案: 假设在Orid的答案中使用GroupDetails,您是否尝试过JPA 2.1 @ConstructorResult? 并在存储库界面中使用以下命令: 根据springJPA的数据文件,spring将首先尝试找到

  • 并且我希望将结果映射到非实体POJO。 是否可能?如果可能,请提供一个例子?

  • 我使用Spring JDBC框架(如这里所示)从数据库中获取两列。我使用了“映射器”来实现“RowMapper”类,并执行如下查询: 这是我的映射器类: 而不是将查询结果存储到<code>中 如何在spring中将我的查询行存储到一个映射中,并将< code>ID设置为key,值为< code>account。

  • 如何在Spring Data Jpa中将映射映射到存储库中的查询? 下面是我的通用存储库源代码。 如下所示,我希望接收queryParams作为参数,并将queryParams对应的键和值映射到where子句。 因为它是一个GenericRepository,所以无法实现,我想把映射的内容放在@Query中。 我一直在搜索,但我找不到任何关于它的信息,所以我不知道如何解决这个问题。 如果有办法,请

  • 问题内容: 是否可以将本机SQL查询的结果映射到Grails域类实例的集合? 问题答案: