【问题标题】:Spring Data dto projection methodSpring Data dto投影方法
【发布时间】:2020-07-20 20:11:44
【问题描述】:

我在下面有一个复杂的查询,但我需要将此 DeploymentD 投影到我可以使用哪种方法进行投影?此查询位于扩展 JpaRepository 的接口类中。稍后在另一个课程中,我需要在我的代码中使用结果列表。

基本上我需要将我的本机查询映射到 dto,所以对于像我这样的查询我该怎么做?我进行了研究,但例如 JPQL 查询使用简单的本机查询。

@Query(value = "SELECT a.name, a.created_at, a.updated_at, d.version, a.image, d.id, d.app_id\n" +
            "FROM applications a\n" +
            "LEFT JOIN deployments d ON d.app_id = a.id\n" +
            "WHERE d.app_id IS NULL\n" +
            "union\n" +
            "select a.name, d.created_at, d.updated_at, d.version, a.image, d.id, d.app_id from applications a\n" +
            "inner join deployments d on d.app_id = a.id\n" +
            "where d.updated_at = (\n" +
            "select max(d1.updated_at) from deployments d1 where d1.app_id = a.id)\n" +
            "ORDER BY name",  nativeQuery = true)
    List<Deployment> findLatestDeployments();

我不能像 List findLatestDeployments() 那样直接使用它;它给出了这样的错误:

{"timestamp":1595277133888,"message":"No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type [com.gg.applications.model.DeploymentDto]"

【问题讨论】:

  • 查询将在方法被调用时执行(假设一切都正确连接)所以不确定我可以使用哪种方法进行投影是什么意思。
  • 我需要在我的项目中使用部署的 dto 而不是部署本身。当我尝试将最后一部分转换为 List findLatestDeployments();它给出了一个错误,所以我需要将结果直接映射到 DTO,但是例如 JPQL 查询对我不起作用,因为我的查询很复杂,我不知道该怎么做
  • 我更新了我的问题,我希望我很清楚:(

标签: java spring-boot jpa spring-data-jpa dto


【解决方案1】:

如果您的 DTO 是一个类,您需要使用 @SqlResultSetMapping。不过我会推荐给make your DTO a Interface and use this as a projection

interface Deployment{
  public String name();
  public LocalDateTime created_at();
  public LocalDateTime updated_at();
  public long version();
  public byte[] image();
  public Long id();
  public Long app_id();
}

【讨论】:

  • 是的,它是类,所以我的数据也很大,如果我想在构建部署列表后进行迭代,使用它会很快吗?我正在开发一个项目,所以它必须尽可能快
  • 在性能方面,类和接口投影之间没有区别。您的 SQL 查询对性能至关重要。
  • 还有一个问题,我应该使用构造函数结果映射还是实体结果映射。识别它们之间的区别
  • 老实说我不知道​​实体结果映射。当我决定使用投影时,我希望数据只读,因此构造函数结果就足够了。
  • 我已经有 DeploymentDto 类,当我把 @SqlResultSetMapping 放在那里时,它给出了一个错误。我用谷歌搜索了它并放置了实体标签,但它仍然给出了错误。 “SqlResultSetMapping' 不适用于字段”。类也有 Data Getter Setter AllArgsConstructor NoArgsConstructor Builder 标签
猜你喜欢
  • 2018-03-05
  • 2018-10-15
  • 2021-03-22
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 2016-01-20
  • 1970-01-01
相关资源
最近更新 更多