【发布时间】: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