java - 为什么这个 Hibernate Criteria Query 失败并返回 "No explicit selection and an implicit one cold not be determined"?

标签 java hibernate hibernate-criteria criteriaquery

我有一个名为 Bucket 的实体,我正在尝试构建条件查询以确定是否存储了“名称”属性等于“Bucket_1”的 Bucket。所以基本上它是一个存在的查询。

Bucket类没有什么特别的,简单的不可能:

@Entity(name="Bucket")
@Table(name = "BUCKETS")
public class Bucket implements Serializable {
    private static final long serialVersionUID = 1L;

    @Column(name = "BUCKET_NAME", length=200)
    private String Name;

        ...
}

对于查询,这是我到目前为止所做的:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Boolean> superQuery = criteriaBuilder.createQuery(Boolean.class);

Class<? extends T> scopeClass = Bucket.class;
Root<? extends T> root = superQuery.from(scopeClass);

Path<?> attributePath = root.get("Name");
Predicate pred = criteriaBuilder.equal(attributePath, criteriaBuilder.literal("Bucket_1"));

Subquery<? extends T> subQuery = superQuery.subquery(scopeClass);
subQuery.where(pred);
Predicate where = criteriaBuilder.exists(subQuery);

superQuery = superQuery.select(where);

/* This line fails!! */
TypedQuery<Boolean> typedQuery = em.createQuery(superQuery);

boolean result = typedQuery.getSingleResult();

当我执行关于的查询时,我在最后一行得到以下异常:

Caused by: java.lang.IllegalStateException: No explicit selection and an implicit one cold not be determined
    at org.hibernate.ejb.criteria.QueryStructure.locateImplicitSelection(QueryStructure.java:296)
    at org.hibernate.ejb.criteria.QueryStructure.render(QueryStructure.java:249)
    at org.hibernate.ejb.criteria.CriteriaSubqueryImpl.render(CriteriaSubqueryImpl.java:281)
    at org.hibernate.ejb.criteria.predicate.ExistsPredicate.render(ExistsPredicate.java:57)
    at org.hibernate.ejb.criteria.predicate.ExistsPredicate.renderProjection(ExistsPredicate.java:62)
    at org.hibernate.ejb.criteria.QueryStructure.render(QueryStructure.java:252)
    at org.hibernate.ejb.criteria.CriteriaQueryImpl.render(CriteriaQueryImpl.java:340)
    at org.hibernate.ejb.criteria.CriteriaQueryCompiler.compile(CriteriaQueryCompiler.java:223)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:441)
    at com.specktro.orchid.io.connection.database.dao.internal.DefaultDAO.has(DefaultDAO.java:426)
    ... 28 more

我进行了很多研究,但找不到任何有相同错误的人对其进行解释和/或修复。

我也试过这种方式:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Boolean> superQuery = criteriaBuilder.createQuery(Boolean.class);

Class<? extends T> scopeClass = Bucket.class;
superQuery.from(scopeClass);
Subquery<? extends T> subQuery = superQuery.subquery(scopeClass);
Root<? extends T> root = subQuery.from(scopeClass);

Path<?> attributePath = root.get("Name");
Predicate pred = criteriaBuilder.equal(attributePath, criteriaBuilder.literal("Bucket_1"));

Subquery<? extends T> subQuery = superQuery.subquery(scopeClass);
subQuery.where(pred);
Predicate where = criteriaBuilder.exists(subQuery);

superQuery = superQuery.select(where);

/* This line fails!! */
TypedQuery<Boolean> typedQuery = em.createQuery(superQuery);
boolean result = typedQuery.getSingleResult();

但我得到了完全相同的异常。

有谁知道我为什么会收到这个问题以及如何解决这个问题?

谢谢!! 爱德华多

更新:

我已经能够使用以下方式构建查询:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

CriteriaQuery<Bucket> query = criteriaBuilder.createQuery(Bucket.class);
Root<Bucket> root = query.from(Bucket.class);
query.select(root);

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

Path<?> attributePath = subRootEntity.get("Name");
Predicate pred = criteriaBuilder.equal(attributePath, criteriaBuilder.literal("Bucket_1"));
subquery.where(pred);
query.where(criteriaBuilder.exists(subquery));

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

boolean entityExists = typedQuery.getResultList().size() == 1;

这导致了像这样生成的奇怪 SQL:

select generatedAlias0 from com.test.Bucket as generatedAlias0 where exists (select generatedAlias1 from com.test.Bucket as generatedAlias1 where generatedAlias1.Name=:param0)

我想最困难的部分是让 select 1 ... 继续,外部查询的结果是 boolean 值而不是匹配的实体。

我知道我得到的这个作品,我现在只是想学习如何“正确地”做,我相信有办法......

最佳答案

你能做到吗?

boolean result = (session.createCriteria(Bucket.class)
       .add(Restrictions.eq("Name","Bucket_1"))
       .setProjection(Projections.count("Name"))
       .uniqueResult() > 0);

关于java - 为什么这个 Hibernate Criteria Query 失败并返回 "No explicit selection and an implicit one cold not be determined"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6720631/

相关文章:

java - 从可迭代集合中删除最小值和最大值

java - Android:自定义设计控件的选择器 (xml) 文件的存储位置

Hibernate检测转换失败: cannot find class (HHH000373)

java - 通过 Hibernate 的 org.hibernate.Query 将 Clob 数据加载为字符串(eager)

java - Spring Boot Hibernate、CriteriaBuilder

java - Hibernate 中缺少列错误?

java - 用于搜索特定字母帮助的代码

java - 从文件中读取分隔符之间的行

java - Spring+hibernate java.lang.StackOverflowError

java - 如何编写 Hibernate Criteria 以通过 Projection List 获取嵌套对象?