将查询结果转换为对象

Convert Query Result to Object

我有一个这样的 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 class:

@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]

的转换器

为什么它不起作用?

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

public interface MenetlevelStat {

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

}

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

You can dramatically simplify the code for a DTO by using Project Lombok, which provides an @Value annotation.

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

@Value
public class MenetlevelStat {

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

}

当使用注解时:

Fields are private final by default, and the class exposes a constructor that takes all fields and automatically gets equals(…) and hashCode() methods implemented.

您可以直接将实体转换为dtos。 这是代码:

@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 class:

   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
    }

希望对您有所帮助。