2

在 JPA 标准中使用 fetch 连接时,看不到导航方法。下面给出一个例子。

Root<UserTable> root = criteriaQuery.from(entityManager.getMetamodel().entity(UserTable.class));
Fetch<UserTable, StateTable> fetch = root.fetch(UserTable_.stateTable, JoinType.INNER);

要浏览相关实体,Fetch需要将此类型强制转换为如下所示的连接。

Join<UserTable, StateTable> join = (Join<UserTable, StateTable>) root.fetch(UserTable_.stateTable, JoinType.INNER);

导航方法get()在此转换后可用,就像,

join.get(UserTable_.firstName);

这种类型转换是否可移植(虽然它适用于 EclipseLink (2.5.1) 和 Hibernate (4.3.5))?有没有其他方法可以做到这一点?为什么条件获取连接不支持导航方法有什么具体原因吗?


更新:( 我仍然认为这只是部分答案。因此,没有写在答案部分)

詹姆斯在这里很好地发现了为什么非常不鼓励使用导航方法(包括 JPQL 中的别名)并且不推荐特别是在关系中(因此不直接在s 中提供/支持):FETCH JOINOneToManyFETCH JOIN

EclipseLink 允许您在JOIN FETCH. 此支持旨在用于OneToOneManyToOne关系,以避免为了获得别名而必须加入两次,以及允许以不会过滤结果和改变对象构建ORDER BY方式的方式或其他方式使用它。但是,没有什么可以阻止您使用它来过滤获取 结果的内容。OneToManyOneToMany

您可能想用给定的示例阅读整个博客。根据我的经验,Hibernate(最新版本)也允许我们这样做。

一般来说,我个人不会在OneToMany关系中使用别名来浏览目标实体(具有外键的实体),这在实际项目中充其量是不需要的,但在OneToOneand/or中是必需的ManyToOne

4

1 回答 1

-1

你可以打电话

Join<UserTable, StateTable> join = root.join("prop", JoinType.INNER);

见这里: http://docs.oracle.com/javaee/6/api/javax/persistence/criteria/From.html#join(java.lang.String,%20javax.persistence.criteria.JoinType)

于 2014-06-19T10:05:08.480 回答