【问题标题】:Convert Query Result to Object将查询结果转换为对象
【发布时间】:2019-12-29 21:03:08
【问题描述】:

我有一个这样的 JPARepository:

public interface MenetlevelRepository extends JpaRepository<Menetlevel,Long> {

    @Query(
            value = "select YEAR(datum) as \"ev\",MONTH(datum) as \"ho\", munkagep_id as \"gepid\", SUM(tevekenysegora) as \"sumtev\" from menetlevel group by munkagep_id, YEAR(datum), MONTH(datum)",
            nativeQuery = true
    )
    Collection<MenetlevelStat> getRendetzettMenetlevel();



}

我必须像这样将结果转换为 MenetlevelStat 类:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class MenetlevelStat {

    int ev;
    int ho;
    Long gepid;
    Double sumtev;

}

当我运行我的代码时,我遇到了一些错误: 没有找到能够从类型 [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] 转换为类型 [...... model.MenetlevelStat]

的转换器

为什么它不起作用?

【问题讨论】:

  • 只创建一个实体类
  • 我会建议一个简单的春季教程。随便找一个。有很多可以找到。这样您就可以了解更多信息。

标签: java spring jpa jpql


【解决方案1】:

您可以直接将实体转换为 dto。 代码如下:

@Repository
public interface LogRepository extends JpaRepository<Log, Long> {
    @Query("SELECT l FROM Log AS l")
    List<Log> findAll();

    @Query("SELECT new test.pckg.dto.LogDTO(l.message, l.date) FROM Log l WHERE l.level = :level")
    List<LogDTO> fetchLogsByLevelAsDTO(@Param("level") String level);
}

和 dto 类:

   package test.pckg.dto

   public class LogDTO {
        private String message;
        private LocalDateTime date;
        public LogDTO(String message, LocalDateTime date){
            this.message = message;
            this.date = date;
        }
        //getters and setters
    }

希望对你有帮助。

【讨论】:

  • 很高兴它有帮助:),这很容易,只需为 group by 结果声明另一个 dto 并使用 group by 更改查询。看看这个线程:stackoverflow.com/questions/36328063/…
  • 即:localDateTime.getYear()
  • 我在 JPQL 查询中需要它 :)
  • 您可以调用一个函数从日期中提取年份(例如 mysql 中的 YEAR()),但我认为这会将您的代码耦合到您的 RDBMS,所以我建议您从 DTO 获取它.您还必须将 dto 中的日期更改为另一种类型(例如整数或字符串)。
【解决方案2】:

您应该利用 Spring Data JPA 中提供的称为投影接口的功能。你必须像这样定义你的界面。

public interface MenetlevelStat {

    int getEv();
    int getHo;
    Long gepId;
    ...

}

如果您必须坚持使用 Lombok,那么根据文档:

您可以使用 Project 显着简化 DTO 的代码 Lombok,它提供了一个@Value 注解。

在你的情况下最终会是这样的:

@Value
public class MenetlevelStat {

    int ev;
    int ho;
    Long gepid;
    Double sumtev;

}

当使用注解时:

默认情况下,字段是私有的,并且该类公开了一个 构造函数接受所有字段并自动获取 equals(...) 和 已实现 hashCode() 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2020-04-23
    • 2015-10-14
    • 2012-07-05
    相关资源
    最近更新 更多