Java JPQL查询:选择一个布尔值,它是对象两个字段的AND
假设我有一个名为MyData的JPA注释类,其主标识符字段BigDecimal类型为primaryID,两个布尔字段分别为fieldA和fieldB。我想做的是创建一个JPA查询,为给定的MyData实例选择fieldA和fieldBJava 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
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行就可以了。