当前位置: 首页 > 知识库问答 >
问题:

包含聚合和子查询的JPA查询的格式?

殳勇
2023-03-14
@Entity
@Table(name = "INSTRUCTION")
public class Instruction {

    @Id
    @Column(name = "ID", nullable = false, unique = true)
    public Long id;

    @Column(name = "CURRENT_STATUS", nullable = false)
    private InstructionState currentStatus;

    @Column(name = "SUBTYPE", nullable = false)
    private InstructionAction subtype;

    //Getters & Setters
}

我想用JPA编写以下查询,以检索按current_statussubtype分组的指令的计数。我知道以下SQL可以工作:

SELECT CURRENT_STATUS, SUBTYPE, COUNT(*) count 
FROM (SELECT ID, CURRENT_STATUS, SUBTYPE 
        FROM INSTRUCTION 
        WHERE VALUE_DATE= '17-JUN-21'  
        AND LAST_UPDATED >= '16-JUN-21' 
        AND LAST_UPDATED < '17-JUN-21' 
        GROUP BY ID, CURRENT_STATUS, SUBTYPE)
GROUP BY CURRENT_STATUS, SUBTYPE;

我想从这个查询中获取结果,并将其映射到一个新的对象调用instructionCount:

public class InstructionCount {

    private InstructionState status;
    private InstructionAction subType;
    private Integer count;

    public InstructionCount(final InstructionState status, final InstructionAction subType, final Integer count) {
        this.status = status;
        this.subType = subType;
        this.count = count;
    }

    //Getters and setters
}

问题所在

@Query(value = "SELECT new com.modles.InstructionCount(CURRENT_STATUS status, SUBTYPE subType, COUNT(*) count) \n" +
            "FROM (SELECT ID, CURRENT_STATUS, SUBTYPE \n" +
            "\t\tFROM LTD_RTGS_CASHINSTRUCTION \n" +
            "\t\tWHERE VALUE_DATE= :valueDate  \n" +
            "\t\tAND LAST_UPDATED >= :lastUpdatedFrom \n" +
            "\t\tAND LAST_UPDATED < :lastUpdatedTo \n" +
            "\t\tGROUP BY ID, CURRENT_STATUS, SUBTYPE)\n" +
            "GROUP BY CURRENT_STATUS, SUBTYPE", nativeQuery = true)
    List<InstructionCount> findInstructionCounts(@Param("valueDate") LocalDate valueDate, @Param("lastUpdatedFrom") LocalDateTime lastUpdatedFrom, @Param("lastUpdatedTo") LocalDateTime lastUpdatedTo);

共有1个答案

鲁品
2023-03-14

下面的查询应该工作得很好,不需要您的内部/子查询

SELECT CURRENT_STATUS, SUBTYPE, COUNT(ID)  
FROM INSTRUCTION 
        WHERE VALUE_DATE= '17-JUN-21'  
        AND LAST_UPDATED >= '16-JUN-21' 
        AND LAST_UPDATED < '17-JUN-21' 
GROUP BY CURRENT_STATUS, SUBTYPE;

当返回结果为

指令计数

 类似资料:
  • 我有以下JPA实体(getter、setter和非相关字段省略): 我的目标是使用JPQL或criteriaAPI实现查询,它将返回每天的平均事务量和最大事务量。 产生预期结果的原生SQL查询(MySQL数据库)如下所示: 遗憾的是,不鼓励使用本机 SQL 查询,并且 JPQL 不允许在 where 子句中使用子查询。 提前谢谢你。 附加: 我从以下Spring数据查询开始: 但显然没有用: 我可

  • 我有一个Spring Boot应用程序。在其中,我有一个SQL查询,需要创建一个子查询,内部将该子查询的结果与另一个表连接,然后从该内连接的结果中进行选择。但是很明显,JPA不允许您在OF子句中使用子查询(我假设既不使用JPQL也不使用Criteria API)。有没有办法绕过这个? 我考虑过将子查询的结果存储在一个临时实体中(理想情况下不创建可持久化到DB的表),然后从存储在这些实体中的数据中进

  • >[danger] 注意!!! 使用聚合功能时,必须给它一个别名,以便能够从模型中访问它 > 聚合函数的计算,都是排除了 null 值,所以COUNT( id ) 一般推荐用非空的主键来计算 COUNT 计算数量 const { Sequelize } = app; // 查询班级总人数,按照姓名聚合 const ret = await Student.findAll({ attribut

  • 在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括: 方法 说明 count 统计数量,参数是要统计的字段名(可选) max 获取最大值,参数是要统计的字段名(必须) min 获取最小值,参数是要统计的字段名(必须) avg 获取平均值,参数是要统计的字段名(必须) sum

  • 我知道elasticsearch允许子聚合(即嵌套聚合),但是我想对“第一次”聚合的结果应用聚合(或者在通用的任何查询中-聚合与否)。 具体示例:我记录有关用户操作的事件(为简单起见,我有带有和的文档)。我可以进行查询,计算每个用户执行的操作数量。但是我想找出“活跃用户”的百分比(或计数)(例如,执行了10个以上操作的用户)。理想的结果是所有用户的直方图,显示用户的活跃程度。 有没有办法创建这样的

  • 问题内容: 当表开始增长时,我担心WHERE子句中IN的性能。有没有人对这种查询有更好的策略?子查询返回的记录数比TradeLine表中的记录数增长得慢得多。TradeLine表本身以每天10个的速度增长。 谢谢你。 编辑:我使用了将子查询从WHERE移到FROM的想法。我对有助于此新查询的所有答案投了赞成票。 问题答案: 子句中的子查询不依赖于外部查询中的任何内容。您可以安全地将其移到子句中;一