JPA中的自定义连接条件

时间:2014-07-21 08:50:45

标签: sql jpa jpql spring-data-jpa

是否可以在JPA中指定自定义连接条件(jpql或通过条件api?

select .. from .. join ... on (... <custom criteria> )   

我需要这个的原因是因为我想在日期范围内加入一组表(一个是具有事实堆叠的历史表)

**更新**

可以在JPA(2.1&gt;)中指定其他连接条件/标准。见接受的答案(zxcf)。

Hibernate注意:虽然可以使用JOIN .. ON或使用javax.persistence.criteria.JOIN进行编程指定其他连接条件,但是不能使用引用不同表的条件,只能引用相同的条件我们支持表格(层次结构中不高),请参阅:https://hibernate.atlassian.net/browse/HHH-7321

2 个答案:

答案 0 :(得分:6)

除非您在两个实体之间有明确的关系,否则您无法使用JOIN关键字 - 如果您有关系,则可以使用:

SELECT e FROM Employee e JOIN e.projects p

您可以使用JOIN关键字来缩小ON的范围(请注意,这适用于JPA 2.1):

SELECT e FROM Employee e JOIN e.projects p ON p.name LIKE 'As%'

如果要定义连接两个没有定义关系的实体的JOIN,则应在WHERE子句中使用其他条件:

SELECT e FROM Employee e, Projects p WHERE e.projectId = p.id

更新

如果您在版本2.4或更高版本中使用EclipseLink(或它是您的JPA提供商),那么您可以JOIN .. ON子句中使用自定义条件,因为EclipseLink也是支持在两个根级对象之间使用ON子句。

SELECT e FROM Employee e LEFT JOIN MailingAddress a ON e.address = a.address

Here's reference

答案 1 :(得分:0)

我认为Dobrowolski的答案需要更新,以备将来参考,因为EclipseLink不再专门提供此功能(至少对于与无关实体有关的功能)。如果您使用的是Hibernate(5.1或更高版本),现在可以使用JPQL / HQL在不相关的实体上声明显式联接(即,无需显式mapping),如您从此example所见:< / p>

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

List<Object[]> results = em.createQuery("SELECT p.firstName, p.lastName, n.phoneNumber FROM Person p JOIN PhoneBookEntry n ON p.firstName = n.firstName AND p.lastName = n.lastName").getResultList();

for (Object[] result : results) {
    log.info(result[0] + " " + result[1] + " - " + result[2]);
}

em.getTransaction().commit();
em.close();