gpt4 book ai didi

java - JPA-2.0 简单的 Select-Where 问题

转载 作者:行者123 更新时间:2023-11-29 04:01:03 25 4
gpt4 key购买 nike

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

@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
}

我的出发点是

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?
...

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

最佳答案

尝试

SELECT d FROM DataSet d WHERE EXISTS 
(SELECT e FROM Event e WHERE e.dataSet = d and e.type = :type)

编辑:正如 Pascal 指出的那样,您似乎正在使用 Criteria API。对此不太熟悉,但我会尝试一下。

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。

关于java - JPA-2.0 简单的 Select-Where 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3602456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com