JPA Critiera查询,使用三个OR谓词进行多个连接
我正在使用JPA Criteria API编写一个查询,其中我希望获得与以下任何谓词匹配的所有旅行:JPA Critiera查询,使用三个OR谓词进行多个连接,jpa,criteria-api,Jpa,Criteria Api,我正在使用JPA Criteria API编写一个查询,其中我希望获得与以下任何谓词匹配的所有旅行: 获取我拥有的所有旅行(MasterTravels)(所有者=用户) 获取我作为乘客的所有行程(乘客,用户=用户) 获取我申请的所有旅行(MasterTravelApplication,user=user) 第一个谓词很简单。我只是检查MasterTravel中的所有者=用户。对于第二个谓词,我需要加入MasterTravel->MTT->Travel->Passenger,然后检查Passe
- 获取我拥有的所有旅行(MasterTravels)(所有者=用户)
- 获取我作为乘客的所有行程(乘客,用户=用户)
- 获取我申请的所有旅行(MasterTravelApplication,user=user)
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();
CriteriaQuery q=cb.createQuery(MasterTravel.class);
根根=q.from(MasterTravel.class);
//连接1,这些工作正常
Join mtts=root.Join(MasterTravel_uuz.mtt);
连接行程=MTT.连接(MTT.行程);
加入乘客=旅行加入(旅行乘客);
//加入2,这不起作用
Join application=root.Join(MasterTravel应用程序);
谓词p=cb.or(
cb.equal(乘客获取(乘客用户),用户),
cb.equal(root.get(MasterTravel_uu2;owner)、user),
cb.equal(application.get(MasterTravelApplication_uu.user),user));//当我添加这个时,它停止工作
q、 选择(根);
q、 式中(p);
q、 orderBy(cb.desc(root.get(MasterTravel\uuu.createdTimestamp));
q、 清晰(真实);
List resultList=em.createQuery(q).getResultList();
您没有描述实体之间的链接,但我猜主旅行不一定至少有一个应用程序,而且由于您正在进行内部连接,因此找不到所有没有任何应用程序的主旅行
使用join方法,将
JoinType
作为参数,并使用JoinType.LEFT
是,抱歉。我忘了提到MasterTravelApplication在MasterTravel中被映射为@OneToMany。与左连接,而不是内部连接它的作品漂亮,谢谢@乔纳斯:如果这是解决办法的话。你能分享你所做的吗?