gpt4 book ai didi

Spring-Data + QueryDSL + JDBC : how to map the query results to the domain objects?

转载 作者:行者123 更新时间:2023-12-01 06:27:27 25 4
gpt4 key购买 nike

我正在考虑使用Spring-Data + QueryDSL + JDBC 来替代(或增强)目前使用的MyBatis。
我的理由是:

  • 列名的编译时检查
  • SQL 语句的编译时检查和来自 IDE 的自动完成
  • 能够针对适用于实际数据库的相同代码对 Java 集合编写单元测试,这比预填充数据库更简单、更快
  • 比MyBatis更简洁——DAO层下不需要单独的XxxMapper.java和XxxMapper.xml

  • 但是我看到以下问题:
  • 没有用于将查询结果映射到域对象的基础结构。 QueryDSL 的 QBean 和 MappingProjection,Spring 的 BeanPropertyRowMapper 和 Spring-Data 的 OneToManyResultSetExtractor 似乎太低级了,见下文。
  • MyBatis 中没有免费提供的开箱即用的 session /事务级缓存
  • MyBatis 中没有开箱即用的 SQL 语句和结果日志

  • 由于我只问一个问题,让我们专注于我认为最重要的问题的映射。
    所以我的问题是:
    是否有任何方便的解决方案将 QueryDSL 的 SQLQuery 结果映射到域对象,类似于 MyBatis 或 JPA 提供的? 也就是说,映射基于一些简单的配置,是 XML、注释还是简单的 Java?

    特别是,我对以下内容感兴趣:
  • 将列映射到自定义类型,例如一个字符串列到一个 EmailAddress Java 对象
  • 将一组列映射到嵌入对象,例如将 {first_name, last_name} 分组为 FullName Java 对象
  • 支持一对多关系,例如能够提取包含地址列表的 Customer 对象。

  • 总而言之,我需要一种简单的方法来从以下 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 代码,特别是允许轻松编写三个 DAO 方法来检索“客户”:没有“地址”和“自我描述”信息,只有“地址”,以及所有字段
  • 允许编译时检查您的 SQL 代码
  • 不需要从 SQL 手动编码每个域类的映射。

  • 替代方案应该适用于上面的示例。

    已经考虑的解决方案:
  • MyBatis 'Builder' 类( http://mybatis.github.io/mybatis-3/statement-builders.html ):不够,因为列名和表名仍然是字符串,所以违反了要求(3)
  • Spring-data + JPA + QueryDSL:如果您展示了如何满足要求 (1) 和 (2) 并且如果不提供更简单的解决方案,则可能是一个选项
  • 最佳答案

    Lukas Eder 在这里对类似问题给出了很好的回答:Is it possible to combine MyBatis and QueryDSL/jOOQ?

    他对映射问题的回答是使用 Java 8 functional style capabilities或专用解决方案,例如 modelmapper .

    他还提到了Spring JCache support作为缓存解决方案和 this solution到日志记录。

    关于Spring-Data + QueryDSL + JDBC : how to map the query results to the domain objects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26595822/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com