Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 在JPQL中计算空值_Jpa_Jpql - Fatal编程技术网

Jpa 在JPQL中计算空值

Jpa 在JPQL中计算空值,jpa,jpql,Jpa,Jpql,我想在JPQL中计算null值,但是count(如果“column”为null,那么..end)不起作用它只在MYSQL上起作用,我不想使用count(*)解决方案是什么 String jpql ="select c.commande.user.login ,count(CASE WHEN c.commande.commandeTms is Null THEN 1 else 0 END) AS count1 from Designation c GROUP BY c.commande.use

我想在JPQL中计算null值,但是count(如果“column”为null,那么..end)不起作用它只在MYSQL上起作用,我不想使用count(*)解决方案是什么

String jpql ="select c.commande.user.login ,count(CASE WHEN c.commande.commandeTms is Null THEN 1 else 0 END) AS count1   from Designation c GROUP BY c.commande.user.login";

给你:我用CriteriaBuilder计算它们。。。因此,您将得到一个包含用户登录和计数元素的元组列表。。。您可能需要根据需要更改名称和“计数案例”:

public List<Tuple> test() {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Tuple> cq = cb.createQuery(Tuple.class);
    Root<Designation> designation = cq.from(Designation.class);

    Join<Designation, Commande> commande = designation.join("commande");
    Join<Commande, User> user = commande.join("user");

    Expression expr = commande.get("commandeTms");

    cq.multiselect(user.get("login").alias("login"), 
            cb.sum(cb.<Long>selectCase().when(expr.isNotNull(), 1L).otherwise(0L)).alias("NotNull"),
            cb.sum(cb.<Long>selectCase().when(expr.isNull(), 1L).otherwise(0L)).alias("Null"));
    cq.groupBy(user.get("login"));

    Query query = entityManager.createQuery(cq);
    return query.getResultList();
}
公共列表测试(){
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Tuple.class);
根名称=cq.from(名称.类别);
连接命令=指定。连接(“命令”);
Join user=command.Join(“用户”);
表达式expr=commande.get(“commandeTms”);
cq.multiselect(user.get(“login”).alias(“login”),
cb.sum(cb.selectCase().when(expr.isNotNull(),1L)。否则(0L))。别名(“NotNull”),
cb.sum(cb.selectCase().when(expr.isNull(),1L)。否则(0L)).alias(“Null”);
groupBy(user.get(“login”);
Query Query=entityManager.createQuery(cq);
返回query.getResultList();
}

对于这种情况,可以使用
求和
聚合函数

String jpql ="SELECT c.commande.user.login, SUM(CASE WHEN c.commande.commandeTms IS NULL THEN 1 ELSE 0 END) AS count1 FROM Designation c GROUP BY c.commande.user.login";

不,我想使用count(case),因为我有多个count@JBNizet更新。。。Moez Latrach,也许你应该用一个你想要实现的例子来更新你的问题?好吧,在提交答案之前,我花了自己的时间做了一些单元测试。。。我已经编辑了我的回答谢谢你的回答,但我尝试了另一个更简单的解决方案,它解决了我的问题。我在表中创建了另一个布尔属性,当属性“commandeTms”不为null时,该属性为true(“commandeTms”是我在上面的旧计数(案例)中使用的属性)所以当这个新属性为true时,我直接从它计算。那么,是什么让你认为它只在MySQL上有效呢?您尝试过哪些数据库管理系统?您得到了什么错误?因为只有当我使用mysql时才显示正确的值,如果我尝试使用JPQL,结果显示为0