将查询结果转换为对象

时间:2019-08-25 09:39:46

标签: java spring jpa jpql

我有一个这样的JPAR存储库:

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]类型的转换器

为什么不起作用?

2 个答案:

答案 0 :(得分:0)

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

public interface MenetlevelStat {

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

}

如果您必须坚持使用龙目岛,请按照文档进行操作:

  

您可以使用Project大大简化DTO的代码   龙目岛,提供@Value注释。

您的情况最终会像这样:

@Value
public class MenetlevelStat {

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

}

使用注释时:

  

字段默认为private final,该类公开   构造函数,它接受所有字段并自动获取equals(…)和   hashCode()方法已实现。

答案 1 :(得分:0)

您可以直接将实体转换为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
    }

希望有帮助。