Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA Critiera查询,使用三个OR谓词进行多个连接_Jpa_Criteria Api - Fatal编程技术网

JPA Critiera查询,使用三个OR谓词进行多个连接

JPA Critiera查询,使用三个OR谓词进行多个连接,jpa,criteria-api,Jpa,Criteria Api,我正在使用JPA Criteria API编写一个查询,其中我希望获得与以下任何谓词匹配的所有旅行: 获取我拥有的所有旅行(MasterTravels)(所有者=用户) 获取我作为乘客的所有行程(乘客,用户=用户) 获取我申请的所有旅行(MasterTravelApplication,user=user) 第一个谓词很简单。我只是检查MasterTravel中的所有者=用户。对于第二个谓词,我需要加入MasterTravel->MTT->Travel->Passenger,然后检查Passe

我正在使用JPA Criteria API编写一个查询,其中我希望获得与以下任何谓词匹配的所有旅行:

  • 获取我拥有的所有旅行(MasterTravels)(所有者=用户)
  • 获取我作为乘客的所有行程(乘客,用户=用户)
  • 获取我申请的所有旅行(MasterTravelApplication,user=user)
第一个谓词很简单。我只是检查MasterTravel中的所有者=用户。对于第二个谓词,我需要加入MasterTravel->MTT->Travel->Passenger,然后检查Passenger.user=user。对于第三个谓词,我需要在另一个方向加入MasterTravel->MasterTravelApplication,并检查MasterTravelApplication\uuz.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();
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。与左连接,而不是内部连接它的作品漂亮,谢谢@乔纳斯:如果这是解决办法的话。你能分享你所做的吗?