【发布时间】:2019-03-24 09:56:55
【问题描述】:
我需要在一个查询中使用标准 api 选择我的主表和另一个表中每个状态的出现次数。
我当前的解决方案是原生查询,它正在工作,但我想以更基于对象的方式进行。 我尝试通过使用特定查询来选择所有状态,然后手动计算它,从而在标准中执行此操作。但是通过这种方法,我调用了两个查询:一个用于获取主表中的详细信息,另一个用于选择 id 与主表相同的所有状态。 有没有更有效的方法来做到这一点?
这是我的原生查询(简化):
SELECT * FROM(
SELECT a.id, a.type, b.count_pending, b.count_failed, b.count_processed
FROM CM AS a
LEFT JOIN ( SELECT
COUNT( CASE WHEN status = 'PENDING' THEN 1 ELSE NULL END ) count_pending,
COUNT( CASE WHEN status = 'FAILED' THEN 1 ELSE NULL END ) count_failed,
COUNT( CASE WHEN status = 'PROCESSED' THEN 1 ELSE NULL END ) count_processed
FROM CM_PARAM WHERE id_cm = :cmId
GROUP BY id_cm
) AS b ON a.id_cm = b.id_cm
WHERE a.id_cm = :cmId) AS a
这是我的 CM 实体(简化版):
@Entity
public class Cm {
@Id
private Long idCm;
private String type;
// other fields
// setters and getters
}
这是我的 CM_PARAM 实体(简化):
@Entity
public class CmParam {
@Id
private Long idCmp;
@ManyToOne
@JoinColumn(name = "id_cm")
private Cm cm;
private String status;
// other fields
// setters and getters
}
使用本机查询方法,我可以在我的 Cm 实体中添加临时字段:
@Transient
private Long countPending;
@Transient
private Long countFailed;
@Transient
private Long countProcessed;
我如何使用标准 api 做到这一点,如果可能的话,只需一笔交易。
预期的输出会是这样的:
{
"idCm": 1,
"type": "sms",
"countPending": 5,
"countFailed": 3,
"countProcessed": 9
}
【问题讨论】:
标签: java jpa spring-data-jpa criteria-api