【问题标题】:Custom join condition in JPAJPA 中的自定义连接条件
【发布时间】:2014-09-11 17:13:25
【问题描述】:

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

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

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

** 更新**

可以在 JPA (2.1 >) 中指定额外的连接条件/标准。查看已接受的答案 (zxcf)。

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

【问题讨论】:

    标签: sql jpa jpql spring-data-jpa


    【解决方案1】:

    你不能使用JOIN关键字,除非你在两个实体之间有明确的关系——如果你有关系,你可以使用:

    SELECT e FROM Employee e JOIN e.projects p
    

    您还可以使用ON 关键字来缩小JOIN 的范围(请注意,这适用于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

    【讨论】:

    • where 子句中的条件/限制仅适用于通常不可用的隐式连接。可靠的答案
    【解决方案2】:

    我认为 Dobrowolski 的答案需要更新以供将来参考,因为这是 EclipseLink 不再专门提供的功能(至少对于不相关实体而言)。如果您使用的是 Hibernate(5.1 或更高版本),现在可以使用 JPQL/HQL 在不相关实体上声明显式连接(即没有显式 mapping),正如您从 example 中看到的那样:

    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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 2018-11-17
      • 2018-04-13
      • 2011-07-02
      • 1970-01-01
      • 2019-06-17
      相关资源
      最近更新 更多