在 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 JOIN
OneToMany
FETCH JOIN
EclipseLink 允许您在
JOIN FETCH
. 此支持旨在用于OneToOne
和ManyToOne
关系,以避免为了获得别名而必须加入两次,以及允许以不会过滤结果和改变对象构建ORDER BY
方式的方式或其他方式使用它。但是,没有什么可以阻止您使用它来过滤获取 结果的内容。OneToMany
OneToMany
您可能想用给定的示例阅读整个博客。根据我的经验,Hibernate(最新版本)也允许我们这样做。
一般来说,我个人不会在OneToMany
关系中使用别名来浏览目标实体(具有外键的实体),这在实际项目中充其量是不需要的,但在OneToOne
and/or中是必需的ManyToOne
。