是否可以在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
答案 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
答案 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();