【问题标题】:JPA Critiera query with many joins using three OR predicates使用三个 OR 谓词的具有多个连接的 JPA Critiera 查询
【发布时间】:2011-10-19 10:52:00
【问题描述】:

我正在使用 JPA Criteria API 编写一个查询,我想在其中获取与这些谓词中的任何一个匹配的所有旅行:

  • 获取我拥有的所有旅行 (MasterTravels)(所有者 = 用户)
  • 获取我作为乘客的所有旅行(乘客,用户 = 用户)
  • 获取我已申请的所有旅行 (MasterTravelApplication, user = user)

第一个谓词很简单。我只是检查 MasterTravel 中的所有者是否 = 用户。对于第二个谓词,我需要加入 MasterTravel->MTT->Travel->Passenger,然后检查Passenger_.user = user。对于第三个谓词,我需要加入另一个方向 MasterTravel->MasterTravelApplication 并检查 MasterTravelApplication_.user = user。这就是我的查询中断的原因,因为我有两个第一个工作,但是当我尝试添加最后一个谓词时它停止工作。

我应该为最后一个连接创建一个新的根,或者我怎样才能得到下面的连接 1 和连接 2 的并集?

CriteriaQuery<MasterTravel> q = cb.createQuery(MasterTravel.class);
Root<MasterTravel> root = q.from(MasterTravel.class);

// Joins 1, these works fine
Join<MasterTravel, MTT> mtts = root.join(MasterTravel_.mtt);
Join<MTT, Travel> travels = mtts.join(MTT_.travel);
Join<Travel, Passenger> passengers = travels.join(Travel_.passengers);                      

// Joins 2, this doesn't work
Join<MasterTravel, MasterTravelApplication> application = root.join(MasterTravel_.applications);

Predicate p = cb.or(
    cb.equal(passengers.get(Passenger_.user), user), 
    cb.equal(root.get(MasterTravel_.owner), user),
    cb.equal(application.get(MasterTravelApplication_.user), user));  // When I add this it stops working

q.select(root);
q.where(p);         
q.orderBy(cb.desc(root.get(MasterTravel_.createdTimestamp)));                       
q.distinct(true);

List<MasterTravel> resultList = em.createQuery(q).getResultList();

【问题讨论】:

    标签: jpa criteria-api


    【解决方案1】:

    你没有描述实体之间的联系,但我猜一个大师旅行不一定有至少一个应用程序,并且由于你正在做一个内部连接,所有没有的大师旅行没有找到任何应​​用程序。

    使用以JoinType 作为参数的join 方法,并使用JoinType.LEFT

    【讨论】:

    • 是的,对不起。我忘了提到 MasterTravelApplication 在 MasterTravel 中被映射为 @OneToMany。使用左连接而不是内连接,它可以很好地工作,谢谢!
    • @Jonas 如果这是解决方案。你能分享一下你做了什么吗?
    猜你喜欢
    • 2014-03-06
    • 2016-07-22
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多