【问题标题】:How to get all of one entity but filtered relation in JPQL如何在 JPQL 中获取所有一个实体但过滤关系
【发布时间】:2018-02-21 23:10:14
【问题描述】:

我与实体之间存在 OneToMany 关系:Area 和 Reservation。区域有许多保留(或没有),而保留有一个区域。 我想查询所有区域,但对于每个区域,我只有满足条件的预订。

到目前为止,我已经尝试过这样的事情:

em.createQuery("SELECT DISTINCT a FROM Area a LEFT JOIN a.reservations r WHERE r.startDate < :fromDate")
                .setParameter("fromDate", fromDate, TemporalType.TIMESTAMP)
                .getResultList();

但是它不会返回那些没有任何满足条件的保留的区域。

【问题讨论】:

    标签: java jpa entity jpql


    【解决方案1】:

    不能部分填充@OneToMany 集合。 由于您具有双向关系,因此您可以从 Reservations 反过来查询实体:

    SELECT r FROM Reservation r WHERE r r.startDate < :fromDate
    

    这样,您只有满足您要求的预订,尽管区域不明确。

    【讨论】:

      【解决方案2】:

      这是因为您的查询有一个 Where 子句,它不会返回存在于 Area 但不存在于 Reservation 中的记录.

      在这里,您需要 JPA 可能不支持 ON 子句而不是 Where 的内容。

      JPA JPQL 不支持对象之间的任意关系 在“on”子句中定义

      那么有什么办法可以解决这个问题:

      使用 SQL 查询而不是 JPQL

      根据您的对象表和字段值尝试使用以下方法:

      em.createSQLQuery("SELECT DISTINCT a.area_name FROM area a LEFT JOIN a.reservations r ON r.start_date< :fromDate")
                      .setParameter("fromDate", fromDate, TemporalType.TIMESTAMP)
                      .getResultList();
      

      【讨论】:

        猜你喜欢
        • 2019-04-26
        • 2021-12-27
        • 2021-12-20
        • 2023-03-26
        • 2016-06-25
        • 2020-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多