0

假设我有一个MyData使用主标识符字段(BigDecimal类型称为“primaryID”)和两个Boolean字段称为“fieldA”和“fieldB”调用的 JPA 注释类。我想要做的是创建一个将为fieldA AND fieldB给定MyData实例选择的 JPA 查询。

        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: unexpected AST node: and near line 1...。这让我相信我需要一些不同的东西(除了builder.isTrue方法)来指定我想要一个布尔值和我的对象的两个字段。关于我应该如何构建这个查询的任何想法?

4

1 回答 1

0

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

        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;
于 2011-09-29T14:50:42.253 回答