【发布时间】:2015-07-22 13:45:18
【问题描述】:
我有两个实体Foo 和FooDerivedData,如下所述。
实体 Foo:
@Entity
@Table(name="FOO")
public class Foo {
// skipping property declarations
@OneToOne
@PrimaryKeyJoinColumn(name = "FOO_ID")
@Fetch(FetchMode.JOIN)
public getFooDerivedData() {
return fooDerivedData;
}
实体 FooDerivedData
@Entity
@Table(name = "FOO_DERIVED_VW")
@Immutable
public class FooDerivedData {
@Id
@Column(name = "FOO_ID")
long fooId;
@Column(name = "FOO_COUNT")
private Integer fooCount;
@Column(name = "FOO_SUM")
private BigDecimal fooSum;
// Getters left out here
我正在使用 JPA Criteria API(Hibernate 是 JPA 实现),我需要将 FooDerivedData 的实例加载到 Foo 中。默认情况下会急切地获取它,但我希望使用内部连接来获取它,而不是为FooDerivedData 的每个实例使用单独的选择语句。我成功地添加了针对 FooDerivedData 的内部连接。
CriteriaQuery<Foo> criteriaQuery = criteriaBuilder.createQuery(Foo.class);
Root<Foo> root = criteriaQuery.from(Foo.class);
root.join("fooDerivedData");
Predicate p = getPredicate(); // details omitted here
criteriaQuery.select(root).where(p);
虽然我可以从日志中的 SQL 看到为 FOO_DERIVED_VW 添加了内部连接,但没有选择任何列。对于Foo 的每个实例,我仍然需要有一个单独的选择语句来获取我随时可用的数据。
目前的查询是这样的:
select f.foo_id, f.foo_bar from from FOO f
inner join FOO_DERIVED_VW d on d.foo_id = f.foo_id;
select d.foo_id, d.foo_count, d.foo_sum from FOO_DERIVED_VW d where foo_id = ?;
select d.foo_id, d.foo_count, d.foo_sum from FOO_DERIVED_VW d where foo_id = ?;
请注意,我没有从加入的 FOO_DERIVED_VW 中选择任何数据,并且这些数据正在通过其他数据库命中来实现。我希望查询是这样的:
select f.foo_id, f.foo_bar, d.foo_count, d.foo_sum from from FOO f
inner join FOO_DERIVED_VW d on d.foo_id = f.foo_id;
如何从 Criteria API 中的连接实体中选择属性?我可以指示 javax.persistence.criteria.Root 选择我要加入的属性吗?
我尝试将连接更改为提取,或者我指定了连接类型的提取。无论哪种情况,它都会因 Hibernate QueryException 而失败。
Root<Foo> root = criteriaQuery.from(Foo.class);
root.fetch("fooDerivedData");
引起:org.hibernate.QueryException:查询指定连接 正在获取,但获取的关联的所有者不存在 选择列表
【问题讨论】:
标签: java hibernate jpa criteria criteria-api