如何正确确定“存在”JPA 条件查询子句返回的是 true 还是 false?

2022-09-03 18:19:19

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

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

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

我使用子查询执行的部分。我正在为外部查询而苦苦挣扎。where exists (...)

此函数的实际用途是确定子句中的该子查询是返回 还是 返回 。existstruefalse

这是我写的:

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);


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

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

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

这有可能吗?

谢谢!爱德华多


答案 1

是的,这是可能的。假设您有一个与表对应的实体,则需要在 中使用该实体类。dualCriteriaQuery#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);

答案 2

休眠 5 正在工作:

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

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

推荐