gpt4 book ai didi

java - 如何使用 SUM 和 GROUP BY JPA Java 创建条件查询

转载 作者:行者123 更新时间:2023-12-02 09:13:54 25 4
gpt4 key购买 nike

Here my changes base on Ish Answer:

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;
}

Now im having this error: java.lang.IllegalArgumentException: An exception occured looking on class: class ENTITY.TopUpRAMSInfo for constructor using selection criteria types as arguments. If this CriteriaQuery was not intended to be a constructor query please verify that the selection matches the return type.

----- ORIGINAL POST -----

我在执行此操作时遇到一些问题。这是我尝试构建的第一个真正的程序,我需要根据一个领域来总结另一个领域。

这是到目前为止我的代码(请注意,TopUpRAMS 是我的实体,emDAO 是我的实体管理器。

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;
}

最佳答案

您构建 CriteriaQuery 的 WHERE 部分的方式存在问题。该表达式是唯一添加到 WHERE 子句的表达式:

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

但不是这个:

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

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

  1. 使用 cb.and():

    data.where(cb.and(
    cb.greaterThanOrEqualTo(c.get("connectionTime"), fechaI),
    cb.lessThanOrEqualTo(c.get("connectionTime"), fechaF)
    )
    );
  2. CriteriaQuery.where() 可以接受可变数量的参数输入表达式,它们将使用连词(AND运算符(operator))。因此,我们不需要使用 cb.and():

    data.where(cb.greaterThanOrEqualTo(c.get("connectionTime"), fechaI),
    cb.lessThanOrEqualTo(c.get("connectionTime"), fechaF)
    );

您的 CriteriaQuery 中使用的类型也存在问题。您通过 data.multiselect() 进行 2 个字段的投影,这将无法转换为 TopUpRams 实体。

有 3 种方法可以进行多重选择/投影:

  1. CriteriaQuery 类型将为 Object[]

    CriteriaQuery<Object[]> data = cb.createQuery(Object[].class);
    Root<TopUpRAMS> c = data.from(TopUpRAMS.class);
    data.multiselect(c.get("deviceId"), cb.sum(c.get("rechargeValue")));
  2. CriteriaQuery 类型将为 Tuple

    CriteriaQuery<Tuple> data = cb.createTupleQuery();
    Root<TopUpRAMS> c = data.from(TopUpRAMS.class);
    data.multiselect(c.get("deviceId"), cb.sum(c.get("rechargeValue")));
  3. 构造函数的使用

    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;
}

关于java - 如何使用 SUM 和 GROUP BY JPA Java 创建条件查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33115160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com