【问题标题】:Spring Boot custom query group by and countSpring Boot 自定义查询分组和计数
【发布时间】:2020-04-06 12:00:57
【问题描述】:

我在从自定义查询访问数据时遇到问题。

这里是 POJO:

@Getter
@Setter
@NoArgsContructor
@AllArgsConstructor
@Entity
@Table(name = "run_list")    
public class RunList {
    @Id
    @Column(name = "id")
    private Long id;

    @Column(name = "control_run_name"
    private String serverName;

    @Column(name = "control_run_date"
    private Date controlRunDate

<.. bunch of other fields .. >

这里是存储库:

public interface RunListRepository extends JpaRepository<RunList, Long> {

    @Query("SELECT u.serverName,count(u) as controlRunCount from RunList u where u.controlRunDate < :lastUploadDate group by u.serverName")
    List<RunList> findAllControlRunAfterDate(@Param("lastUploadDate") Date lastUploadDate);

在控制器中,我像这样调用存储库方法:

Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2020-03-01");
model.addAttribute("runList",runListRepository.findAllControlRunAfterDate(date);

绑定到查询中的日期可以正常工作,我得到了 group by 的第一个结果,这样就解决了。问题是我在运行时遇到错误:

Failed to convert from type[java.lang.Object[]] to type [@org.springframework.data.jpa.Query my.package.name.RunList} for value '{server1,14}';

当我从它的 CLI 对数据库使用 SQL 查询时,我得到了一个很好的 serverName 和计数分组。 我猜问题出在从存储库方法中突然出现的计数字段的转换中,而 Spring 也不知道要链接什么。

我尝试在这里使用只有一个 String serverName 和一个 Ingeter controlRunCount 的 RunListDTO,但没有成功 - 存储库接口不喜欢我在使用 .

当存储库进行计数时,有没有办法让它成为一个正在运行的自定义数组/对象?

问候, 贾雷克。

【问题讨论】:

    标签: java spring spring-boot jpa count


    【解决方案1】:

    由于您选择了一个字段和一个计数,因此无法将其映射到您的实体,因此此查询返回您指定的值数组,就像您在异常中看到的那样:'{server1, 14}'.

    public interface RunListRepository extends JpaRepository<RunList, Long> {
    
        @Query("SELECT u.serverName,count(u) as controlRunCount from RunList u where u.controlRunDate < :lastUploadDate group by u.serverName")
        List<Object[]> findAllControlRunAfterDate(@Param("lastUploadDate") Date lastUploadDate);
    

    因此,在您的服务中,您可以使用以下数据:

    List<Object[]> list = runListRepository.findAllControlRunAfterDate(yourDate);
    for (Object[] ob : list){
        String serverName = (String)ob[0];
        Integer count = (Integer)ob[1];
    }
    

    【讨论】:

    • 非常感谢先生!像魅力一样工作!
    • 您可以查找一些关于自定义存储库方法返回 Map 对象的文章,您将在其中获得带有您的值的 Map
    猜你喜欢
    • 2019-07-07
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多