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

在JPA中:使用CriteriaQuery计算where子句的查询结果

季博
2023-03-14

我对JPA相当陌生,它是CriteriaBuilder/CriteriaQuery API:

我想查询一组对象的摘录(如下所示,我只选择结果中的元素n到m)

查询本身运行良好,我得到了预期的结果。

但是如果我尝试计算所有可能的结果,我会得到一个java。lang.IllegalArgumentException:

org.hibernate.hql.internal.ast.无效路径:'生成lias1.prop1'[选择计数(生成Alias0)从com.myompany.blablub.MyClass作为生成Alias0其中(1=1)和(生成lias1.prop1=:参数0)]"

final CriteriaQuery<MyClass> criteriaQuery = builder.createQuery(MyClass.class);
    CriteriaQuery<Long> countQuery = builder.createQuery(Long.class);
    countQuery.select(builder.count(countQuery.from(MyClass.class)));

    Long totalCount = -1L;
    List<MyClass> MyClassList;

    Root<MyClass> root = criteriaQuery.from(MyClass.class);



    if(myClassFilter != null) {         

            List<Predicate> predicates = new ArrayList<Predicate>();

            if(myClassFilter.getProp1() != null) {
                Join<MyClass, MyOtherClass> myJoin1 = root.join(MyClass_.prop1);
                predicates.add(builder.equal(myJoin1.get(MyOtherClass_.blah), myClassFilter.getProp1() ));
            }

            if(myClassFilter.getProp2() != null) {
                predicates.add(builder.equal(root.get(MyClass_.blubb), myClassFilter.getProp2() ));
            }

            if(myClassFilter.getProp3() != null) {
                Join<MyClass, MyOtherClass> myJoin2 = root.join(MyClass_.foo);
                predicates.add(builder.equal(myJoin2.get(MyOtherClass_.bar), myClassFilter.getProp3() ));
            }


            if (myClassFilter.getSpecialPropList() != null) { 
                if (myClassFilter.getSpecialPropList().length>0) {
                        Predicate orPredicates = builder.disjunction();
                        for (String specialProp : myClassFilter.getSpecialPropList()) {
                            Join<MyClass, specialProp> specialPropJoin = root.join(MyClass_.specialProps);
                            Predicate newPredicate = builder.equal(specialPropJoin.get(specialProp_.dudum), specialProp);
                            orPredicates = builder.or(orPredicates, newPredicate);
                        }
                        predicates.add(orPredicates);
                }
            }

            Predicate finalPredicate = builder.conjunction();

            for(Predicate p: predicates) {
                finalPredicate = builder.and(finalPredicate, p);
            }

            criteriaQuery.select(root).where(finalPredicate);
            countQuery.where(finalPredicate);
    }

    count = entityManager.createQuery(countQuery).getFirstResult();

    TypedQuery<MyClass> typedQuery = entityManager.createQuery(criteriaQuery);

    if(first >= 0) {
        typedQuery.setFirstResult(first);
    }
    if(count > 0) {
        typedQuery.setMaxResults(count);
    }

    MyClassList = typedQuery.getResultList();

我希望你能给我一个提示,告诉我我做错了什么。

我想我知道我的问题在哪里了。

只有当我使用连接时,行为才会发生。

没有连接的查询如下所示:

select count(generatedAlias0) from MyClass as generatedAlias0 where ( 1=1 ) and ( generatedAlias0.blubb=:param0 )

但当我想使用联接时,它是这样的:

select count(generatedAlias0) from MyClass as generatedAlias0 where ( 1=1 ) and ( generatedAlias1.blah=:param0 )

而没有计数的查询看起来像这样:

select generatedAlias0 from MyClass as generatedAlias0 inner join generatedAlias0.prop1 as generatedAlias1 where ( 1=1 ) and ( generatedAlias1.blah=:param0 )

它显然不知道generatedAlias1是什么,因为缺少了整个连接。有人知道我如何纠正这种行为吗?

共有1个答案

任小云
2023-03-14

您使用标准查询的根创建连接。您还需要使用CountQuery的根创建连接。

Root<MyClass> countRoot = countQuery.from(MyClass.class);
Join<MyClass, MyOtherClass> mycountJoin = countRoot.join(MyClass_.foo);
 类似资料:
  • 问题内容: 谁能给我一些关于如何将这种子查询放入提示?(我正在使用 JPA 2.0 - Hibernate 4.x ) -第二个选择将始终获得单个结果或null。 问题答案: 尝试类似以下示例的操作来创建子查询: 请注意,由于附近缺少IDE,因此该代码尚未经过测试。

  • 问题内容: 我对JPA 2相当陌生,它是CriteriaBuilder / CriteriaQuery API: Java文档 在Java EE 6教程中 我想计算一个CriteriaQuery的结果而不实际检索它们。那有可能吗,我没有找到任何这样的方法,唯一的办法就是这样做: 那不可能是正确的方法… 有解决方案吗? 问题答案: 类型查询将返回。您要查询。 显然,您将希望使用示例中跳过的任何限制和

  • 来自Teradata,我通常会创建一个包含一些变量的易失性表,我会在代码中使用这些变量。 例如。, 然后我会在SELECT WHERE子句中使用该表: 我试图在色调(Impala editor)中执行类似的操作,但遇到了一个错误: AnalysisException:第5行中的语法错误:未定义:来自表名隐藏^遇到:来自预期的:大小写、强制转换、默认值、存在、FALSE、IF、INTERVAL、NO

  • 我有一个具有一-多关系的表,如下所示 城市->学校->老师->孩子 我的从城市检索子级的JPQL如下所示 这里关于Where子句的引用说明 “复合路径表达式使where子句功能极其强大。” 然而,在观察日志时,我意识到上面的查询正在执行奇怪的操作,例如 我试图理解我是否正确地定义了我的查询,如果Where的复合物确实如此强大,为什么我的查询如此低效。

  • 问题内容: 我最近才刚开始使用SQLAlchemy,但仍无法解决某些概念。 归结为基本元素,我有两个这样的表(通过Flask-SQLAlchemy): 我将如何查询用户列表及其最新帖子(不包括无帖子的用户)。如果我使用的是SQL,则可以执行以下操作: 因此,我确切地知道“期望的” SQL可以达到我想要的效果,但是不知道如何在SQLAlchemy中“正确地”表达它。 编辑:如果很重要,我使用的是SQ

  • 问题内容: 在命名查询的where子句中可能有一个like?我正在尝试执行以下操作,但出现异常 我尝试像在普通SQL中那样添加%,但是得到了异常编译。 任何指针,不胜感激! 谢谢 问题答案: 您不能在中添加%,但可以在为其分配参数的值中包含它。 如: