首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA-2.0简单选择-Where问题

JPA-2.0简单选择-Where问题
EN

Stack Overflow用户
提问于 2010-08-31 00:49:06
回答 1查看 3K关注 0票数 1

我遇到了一个关于关系的JPA-2.0查询的问题。如何选择至少具有一个带有type = BEvent的任何Dataset

代码语言:javascript
复制
@Entity
class Dataset {
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "dataset")
    public List<Event> events;
}

@Entity
class Event {
    @ManyToOne
    @JoinColumn
    public Dataset dataset;

    public Type type;
}

enum Type {
     A, B, C
}

我的出发点是

代码语言:javascript
复制
CriteriaBuilder _builder = em.getCriteriaBuilder();
CriteriaQuery<Dataset> _criteria = _builder.createQuery(Dataset.class);

// select from
Root<Dataset> _root = _criteria.from(Dataset.class);
_criteria.select(_root);

// apply some filter as where-clause (visitor)
getFilter().apply(
   _root, _criteria, _builder, em.getMetamodel()
);

// how to add a clause as defined before?
...

关于这个的任何想法。我尝试创建子查询和连接,但不知何故我做错了,结果总是得到所有的数据集。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-31 02:04:31

试一试

代码语言:javascript
复制
SELECT d FROM DataSet d WHERE EXISTS 
    (SELECT e FROM Event e WHERE e.dataSet = d and e.type = :type)

编辑:正如Pascal指出的那样,看起来您正在使用Criteria API。我不太熟悉这个,但我会试一试。

代码语言:javascript
复制
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Dataset> criteria = builder.createQuery(Dataset.class);

Root<Dataset> root = criteria.from(Dataset.class);
criteria.select(root);

// build the subquery
SubQuery<Event> subQuery = criteria.subQuery(Event.class);
Root<Event> eventRoot = subQuery.from(Event.class);
subQuery.select(eventRoot);

ParameterExpression<String> typeParameter = builder.parameter(String.class);
Predicate typePredicate = builder.equal(eventRoot.get(Event_.type), typeParameter));

// i have not tried this before but I assume this will correlate the subquery with the parent root entity
Predicate correlatePredicate = builder.equal(eventRoot.get(Event_.dataSet), root);
subQuery.where(builder.and(typePredicate, correlatePredicate);

criteria.where(builder.exists(subQuery)));

List<DataSet> dataSets = em.createQuery(criteria).getResultList();

嘿,那是一项艰苦的工作。我现在要回Linq了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3602456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档