【发布时间】:2011-08-03 20:46:12
【问题描述】:
我在@ManyToMany 关系中有两个实体。
// Output has 4 other @ManyToOne relationships if that matters
@Entity @Table public class Output {
@Id public String address;
@ManyToMany(targetEntity = Interval.class,
cascade = CascadeType.ALL,
fetch = FetchType.LAZY)
@JoinTable(name = "output_has_interval",
joinColumns = {@JoinColumn(name = "output_address",
referencedColumnName = "address")},
inverseJoinColumns = {@JoinColumn(name = "interval_start",
referencedColumnName = "start"),
@JoinColumn(name = "interval_end",
referencedColumnName = "end")})
Collection<Interval> intervals;
@IdClass(IntervalPK.class) // I'll omit this one.
@Entity @Table public class Interval {
@Id public Calendar start;
@Id public Calendar start;
@ManyToMany(targetEntity = Output.class,
mappedBy = "intervals",
cascade = CascadeType.ALL,
fetch = FetchType.LAZY)
public Collection<Output> outputs;
连接表在output 和interval 之间称为output_has_interval。
这样CriteriaQuery怎么办?
SELECT `output`.`address`
FROM `output`, `output_has_interval`, `interval`
WHERE `output`.`address` = `output_has_interval`.`output_address`
AND `interval`.`start` = `output_has_interval`.`interval_start`
AND `interval`.`end` = `output_has_interval`.`interval_end`
AND `interval`.`start` >= '2011-04-30'
如果我在 MySQL 中发出它,这将按预期工作。
(我也有相应的静态元模型类,根据要求我可以发布它们 - 没什么特别的。)
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Output> cq = cb.createQuery(Output.class);
Root<Output> root= cq.from(Output.class);
CollectionJoin<Output, Interval> join = root.join(Output_.intervals);
Expression<Calendar> start = join.get(Interval_.start);
Predicate pred = cb.greaterThanOrEqualTo(start, /* calendar for '2011-04-30' */);
cq.where(pred);
TypedQuery<Output> tq = em.createQuery(cq);
但是 tq.getResultList 从我的数据库中返回每个 output 行。有什么想法吗?
(附带说明:当我发出此查询时,Hibernate(我正在使用的提供程序)会生成许多 select 语句,Output 具有的每个关系都有一个语句,有时更多。)
编辑:我写道:
tq.getResultList返回每个output我数据库中的行
澄清一下:它返回的不仅仅是我数据库中的每个output 行。它实际上使用output 和interval 进行连接,但是谓词:
`interval`.`start` >= '2011-04-30'
不满意。
【问题讨论】:
标签: java database jpa criteria jpa-2.0