JPA 2.1中的标准提取连接中的导航方法

时间:2014-06-08 08:54:55

标签: hibernate jpa eclipselink jpa-2.1

在JPA标准中使用fetch join时,没有可以看到的导航方法。以下是一个例子。

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))?有没有其他方法可以做同样的事情?有没有具体的原因为什么标准提取连接不支持导航方法?


更新: (我仍然认为这只是一个部分答案。因此,未在答案部分写出)

here James已经很好地发现FETCH JOIN为什么OneToMany中的导航方法(包括JPQL中的别名)非常不鼓励,特别是{{1}关系(因此不会在FETCH JOIN s中直接提供/支持):

  

EclipseLink允许您在JOIN FETCH上使用别名。这种支持   用于OneToOneManyToOne关系,以避免。{   加入它只是为了得到一个别名,以及允许使用它   ORDER BY或以其他方式不会过滤结果和   改变对象的构建方式。但是,没有什么可以阻止你   从与OneToMany一起使用它来过滤所提取的内容   OneToMany结果。

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

一般情况下,我个人不会在OneToMany关系中使用别名来浏览目标实体(具有外键的实体),实际上在实际项目中最多不需要,但是在OneToOne和/或ManyToOne

1 个答案:

答案 0 :(得分:-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)