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
Java JPQL查询:选择一个布尔值,它是对象两个字段的AND_Java_Jpa_Jpql_Criteriaquery - Fatal编程技术网

Java JPQL查询:选择一个布尔值,它是对象两个字段的AND

Java JPQL查询:选择一个布尔值,它是对象两个字段的AND,java,jpa,jpql,criteriaquery,Java,Jpa,Jpql,Criteriaquery,假设我有一个名为MyData的JPA注释类,其主标识符字段BigDecimal类型为primaryID,两个布尔字段分别为fieldA和fieldB。我想做的是创建一个JPA查询,为给定的MyData实例选择fieldA和fieldB final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); final CriteriaQuery<Boolean> boolQuery = b

假设我有一个名为MyData的JPA注释类,其主标识符字段BigDecimal类型为primaryID,两个布尔字段分别为fieldA和fieldB。我想做的是创建一个JPA查询,为给定的MyData实例选择fieldA和fieldB

        final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        final CriteriaQuery<Boolean> boolQuery = builder.createQuery(Boolean.class);
        final Root<MyData> data = boolQuery.from(MyData.class);
        boolQuery.select(builder.isTrue(builder.and(data.<Boolean> get("fieldA"),
                profile.<Boolean> get("fieldB"))));
        final Predicate primaryIDPredicate = builder.equal(profile.<BigDecimal> get("primaryID"),
                1000);
        boolQuery.where(primaryIDPredicate);

        final TypedQuery<Boolean> myQuery = entityManager.createQuery(boolQuery);

当我的entityManager执行此查询时,我得到:org.hibernate.hql.ast.QuerySyntaxException:意外的ast节点:并且在第1行附近。。。。这让我相信,我需要一些不同于builder.isTrue方法的东西来指定我想要对对象的两个字段执行布尔and。关于如何构造这个查询有什么想法吗?

好的,我最后做的只是将我想要的布尔值移动到谓词中,然后检查是否返回了任何内容。当然,我可以简单地基于主ID检索整个对象MyData,并在Java代码中执行and,但关键是要避免获取完整对象,因为它有大量嵌套连接到其引用的集合,在这种情况下,这些连接是不必要的

        final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        final CriteriaQuery<BigInteger> primaryIDQuery = builder.createQuery(BigInteger.class);
        final Root<MyData> data = primaryIDQuery.from(MyData.class);
        primaryIDQuery.select(data.<BigInteger> get("primaryId"));
        final Predicate primaryIDPredicate = builder.equal(profile.<BigInteger> get("primaryId"),1000);
        final Predicate otherPredicate = builder.or(
                builder.isTrue(profile.<Boolean> get("fieldA")),
                builder.isTrue(profile.<Boolean> get("fieldB")));
        primaryIDQuery.where(primaryIDPredicate , otherPredicate);

        final TypedQuery<BigInteger> existenceQuery = entityManager.createQuery(primaryIDQuery);

        boolean whatIWant = existenceQuery.getResultList().size() > 0;

为什么标题上写的是JPQL,当你说需要构造JPA查询时?我理解JPQL的意思是使用JPA查询语言。无论这是否意味着创建一个参数化的JPA字符串查询,或者使用CriteriaBuilder/CriteriaQuery,我并不特别在意。如果我使用的术语有错误,我会更新这个问题。对不起,我自己打错了。在JPA中构建查询实际上有两种主要方法:1 JPQL。示例:从C2类型安全条件查询API中选择a、b。在示例中使用后者。请仔细查看SELECT表达式。您要做的是从MyData中选择fieldA=1和fieldB=1,这当然不是有效的SQL。不能在SELECT子句中指定谓词。现在,考虑一下您试图重现的SQL查询,我将尽力帮助您,在CriteriaAPI中编写它。嗯,您是对的。看起来您实际上不可能在select子句中将基于布尔的表达式作为列,至少在我们使用的底层RDBMS中是这样。我只是假设这是可能的,因为你总是可以做一些像选择1+1的事情,我没有看到布尔与整数的区别。无论如何,我只需将布尔值改为where子句的一部分,并检查返回集中是否有超过0行就可以了。