将查询结果转换为对象
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
}
希望对您有所帮助。
我有一个这样的 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
}
希望对您有所帮助。