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

如何通过JPA Java创建具有SUM和GROUP的条件查询

赵雅懿
2023-03-14
public List<TopUpRAMSInfo> listadoTOPUP2(Date fechaI, Date fechaF) {
        List<TopUpRAMSInfo> lista;
        CriteriaQuery<TopUpRAMSInfo> data = cb.createQuery(TopUpRAMSInfo.class);
        Root<TopUpRAMS> c = data.from(TopUpRAMS.class);
        data.select(cb.construct(TopUpRAMSInfo.class,
                c.get("deviceId"),
                cb.sum(c.get("rechargeValue"))
        )
        );
        data.where(cb.greaterThanOrEqualTo(c.get("connectionTime"), fechaI),
                cb.lessThanOrEqualTo(c.get("connectionTime"), fechaF)
        );
        data.groupBy(c.get("deviceId"));
        TypedQuery<TopUpRAMSInfo> datos = emDAO.createQuery(data);
        lista = datos.getResultList();
        return lista;
    }
public List<TopUpRAMS> listadoTOPUP2(Date fechaI, Date fechaF) {
    List<TopUpRAMS> lista;

    CriteriaQuery<TopUpRAMS> data = cb.createQuery(TopUpRAMS.class);
    Root<TopUpRAMS> c = data.from(TopUpRAMS.class);

    data.multiselect(c.get("deviceId"), cb.sum(c.get("rechargeValue")));
    data.where(cb.greaterThanOrEqualTo(c.get("connectionTime"), fechaI));
    cb.and(cb.lessThanOrEqualTo(c.get("connectionTime"), fechaF));
    data.groupBy(c.get("deviceId"));

    TypedQuery<TopUpRAMS> datos = emDAO.createQuery(data);
    lista = datos.getResultList();
    return lista;
}

共有1个答案

上官和韵
2023-03-14

您如何构建标准中的WHERE部分存在问题。这个表达式是唯一被添加到WHERE子句中的表达式:

cb.greaterThanOrEqualTo(c.get("connectionTime"), fechaI)

但不是这个:

cb.lessThanOrEqualTo(c.get("connectionTime"), fechaF)

任何FF。可以解决这个问题:

data.where(cb.and(
        cb.greaterThanOrEqualTo(c.get("connectionTime"), fechaI),
        cb.lessThanOrEqualTo(c.get("connectionTime"), fechaF)
    )
);
data.where(cb.greaterThanOrEqualTo(c.get("connectionTime"), fechaI),
    cb.lessThanOrEqualTo(c.get("connectionTime"), fechaF)
);
CriteriaQuery<Object[]> data = cb.createQuery(Object[].class);
Root<TopUpRAMS> c = data.from(TopUpRAMS.class);
data.multiselect(c.get("deviceId"), cb.sum(c.get("rechargeValue")));

CriteriaQuery类型将为元组

CriteriaQuery<Tuple> data = cb.createTupleQuery();
Root<TopUpRAMS> c = data.from(TopUpRAMS.class);
data.multiselect(c.get("deviceId"), cb.sum(c.get("rechargeValue")));

构造函数的使用

CriteriaQuery<TopUpRAMSInfo> data = cb.createQuery(TopUpRAMSInfo.class);
Root<TopUpRAMS> c = data.from(TopUpRAMS.class);
data.select(cb.construct(TopUpRAMSInfo.class,
        c.get("deviceId"), 
        cb.sum(c.get("rechargeValue"))
    )
);

为此,您需要创建一个单独的类来表示查询结果的类型(它不必是实体):

public class TopUpRAMSInfo {
    private Long deviceId; 
    private Double sumRechargeValue;

    public TopUpRAMSInfo(Long deviceId, Double sumRechargeValue) {
        this.deviceId = deviceId;
        this.sumRechargeValue = sumRechargeValue;
    }
    ...
}
public List<TopUpRAMSInfo> listadoTOPUP2(Date fechaI, Date fechaF) {

    List<TopUpRAMSInfo> lista;

    CriteriaQuery<TopUpRAMS> data = cb.createQuery(TopUpRAMSInfo.class);
    Root<TopUpRAMS> c = data.from(TopUpRAMS.class);
    data.select(cb.construct(TopUpRAMSInfo.class,
            c.get("deviceId"), 
            cb.sum(c.get("rechargeValue"))
        )
    );
    data.where(cb.greaterThanOrEqualTo(c.get("connectionTime"), fechaI),
        cb.lessThanOrEqualTo(c.get("connectionTime"), fechaF)
    );
    data.groupBy(c.get("deviceId"));

    TypedQuery<TopUpRAMSInfo> datos = emDAO.createQuery(data);
    lista = datos.getResultList();
    return lista;
}
 类似资料:
  • 问题内容: 请帮助我处理使用带有GROUP和SUM的LINQ进行查询的问题。 我希望: 从db.MYDATABASE中获取前25个项目 将所有结果按bs.PRODCODE分组 按每个bs的总和排序。 公司是“我的公司” 然后将数据管道到我的对象中 我很困惑,因为一旦我将其添加到混音中,我的变量就变得无用了。 问题答案: 我很困惑,因为一旦我将组添加到混合中,我的bs变量就变得无用了。 是的,因为您

  • 我当前的jar在build中。gradle如下所示: 而且工作得很好。 然而,我有一个来自格雷德的消息(可能是从6号开始?) 这是实际消息: 零件<代码>配置。不推荐使用compile。 如何更新? 如果我改变了 Gradle说

  • 问题内容: 我需要创建一个动态查询,其中条件将根据传入的请求更改,其中请求将始终通过查询参数获取。例子如下: http:// localhost:8084 / basePath?name = balwant&age = 26 ,或 http:// localhost:8084 / basePath?name = balwant&age = 26&gender = M 同样,它是动态的。现在,我需要

  • 我需要扫描日志文件以找到一些子字符串。 如何在单个正则表达式中组合以下条件: 查找子字符串“AAA”、“BBB”、“CCC”,但 我尝试了类似(?DDD | EEE | FFF)(AAA | BBB | CCC)的东西,但没有成功。 Java模式类应该支持正则表达式语法。 非常感谢。

  • 问题内容: 系列中的下一个’‘ This query is quite slow when the timestamps are chosen such that many rows are matched: 我相信这是因为我在两个字段(DeviceId和StartedAt)上混合了范围条件。 如果是这样,我该怎么办才能解决问题?也许有什么 触发索引合并的使用? 问题答案: 在=“范围”和“范围”

  • 问题内容: 我有一个dbf,我想使用VB6复制到新的mdb中。 以下是我的专长,可以轻松地创建新的mdb,但是,我认为我可以使用INTO进行Select查询,以使用数据创建新表。 请注意:我假设的是在运行SQL查询时创建了MSAccess表。 我在FROM子句中收到语法错误。我试图做的是操纵此sql查询以执行我需要的操作: sql =“将INERT插入[Table1] SELECT * FROM