如何正确确定“存在”的 JPA Criteria Query 子句是否返回 true 或 false?

新手上路,请多包涵

我不知道如何执行返回布尔输出的 JPA 条件查询。

目标是在 Oracle 上呈现如下所示的条件查询:

 select 1 from dual where exists ( ... );

我用子查询执行的 where exists (...) 部分。我正在努力处理外部查询。

它的实际用途是确定 exists 子句中的子查询是否返回 truefalse

这就是我写的:

 CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

CriteriaQuery<Object> query = criteriaBuilder.createQuery();
query.from(Boolean.class);
query.select(criteriaBuilder.literal(true));

Subquery<Location> subquery = query.subquery(Location.class);
Root<Location> subRootEntity = subquery.from(Location.class);
subquery.select(subRootEntity);

Path<?> attributePath = subRootEntity.get("State");
Predicate predicate = criteriaBuilder.equal(attributePath, criteriaBuilder.literal("TX"));
subquery.where(predicate);
query.where(criteriaBuilder.exists(subquery));

TypedQuery<Object> typedQuery = em.createQuery(query);

最后一行输出错误,指出“ Boolean is not an entity ”。我认为我的问题是不知道如何表达查询的“ from ”部分,以便结果输出 1 或 0/true 或 false——而不是实体。

我知道我可以检索任何实体,然后检查结果列表的大小是否为 1。

我在问如何获得布尔结果,既可以避免不必要的检索这些列的任务,也可以学习如何做。

这可能吗?

谢谢!爱德华多

原文由 Edy Bourne 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 605
2 个回答

您可以选择一个属性(例如 ID)并将返回的最大结果设置为 1,这样您就可以确保数据库不会做不必要的工作(比如计算所有实例)。那么您的结果列表要么为空(exists = false),要么只有一个元素(exists = true)。

原文由 dimo 发布,翻译遵循 CC BY-SA 3.0 许可协议

是的,这是可能的。假设您有一个对应于您的 dual 表的实体,您将希望在 CriteriaQuery#from 中使用该实体类。

 CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

CriteriaQuery<Boolean> query = criteriaBuilder.createQuery(Boolean.class);
query.from(dual.class);
query.select(criteriaBuilder.literal(true));

Subquery<Location> subquery = query.subquery(Location.class);
Root<Location> subRootEntity = subquery.from(Location.class);
subquery.select(subRootEntity);

Path<?> attributePath = subRootEntity.get("State");
Predicate predicate = criteriaBuilder.equal(attributePath, criteriaBuilder.literal("TX"));
subquery.where(predicate);
query.where(criteriaBuilder.exists(subquery));

TypedQuery<Boolean> typedQuery = em.createQuery(query);

原文由 Matthew T. Staebler 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题