Java 如何在JPA CriteriaBuilder中使用

Java 如何在JPA CriteriaBuilder中使用,java,jpa,Java,Jpa,我使用JPA,并有对象构建字段Owner和BuildingType。 我想找到所有的建筑物,其中业主是在名单和具体的建筑类型 List<Owner> owners; BuildingType type; CriteriaBuilder builder = getCriteriaBuilder(); CriteriaQuery<Building> criteria = builder.createQuery(Building.class);

我使用JPA,并有对象构建字段Owner和BuildingType。 我想找到所有的建筑物,其中业主是在名单和具体的建筑类型

 List<Owner> owners;
    BuildingType type;
    CriteriaBuilder builder = getCriteriaBuilder();
    CriteriaQuery<Building> criteria = builder.createQuery(Building.class);
    Root<Building> rootBuilding = criteria.from(Building.class);
    criteria.select(rootBuilding);
    criteria.where( builder.equal( rootBuilding.get( _buildingType ), buildingType ) );
列出所有者;
建筑类型;
CriteriaBuilder=getCriteriaBuilder();
CriteriaQuery criteria=builder.createQuery(Building.class);
根rootBuilding=criteria.from(Building.class);
标准。选择(根构建);
其中(builder.equal(rootBuilding.get(_buildingType),buildingType));

最后一行代码适用于buildingType,但适用于所有者列表什么?

说明:

List<Long> ownerIds; //include Id of owners you want
BuildingType type;  //include the type you want 
CriteriaBuilder builder = getSessionFactory().getCurrentSession().getCriteriaBuilder();
CriteriaQuery < Building > criteria = builder.createQuery(Building.class);
Root < Building > myObjectRoot = criteria.from(Building.class);
Join < Building, Owner > joinOwner = myObjectRoot.join("owner");
Join < Building, BuilderType > joinBuilderType = myObjectRoot.join("buildingType");

List < Predicate > predicates = new ArrayList < Predicate > ();
predicates.add(builder.equal(joinBuilderType.get("id"), type.getId()))
predicates.add(builder.in(joinOwner.get("id")).value(ownerIds))
criteria.select(myObjectRoot);
criteria.where(builder.and(predicates.toArray(new Predicate[predicates.size()])));
return entityManager.createQuery(criteria).getResultList();
  • 首先,您需要确保您拥有所有者ID列表,而不是所有者列表
  • 然后,您可以加入owner和BuildingType,并在它们上创建谓词列表
  • 最后在根上选择,该根位于构建实体上

解决方案:

List<Long> ownerIds; //include Id of owners you want
BuildingType type;  //include the type you want 
CriteriaBuilder builder = getSessionFactory().getCurrentSession().getCriteriaBuilder();
CriteriaQuery < Building > criteria = builder.createQuery(Building.class);
Root < Building > myObjectRoot = criteria.from(Building.class);
Join < Building, Owner > joinOwner = myObjectRoot.join("owner");
Join < Building, BuilderType > joinBuilderType = myObjectRoot.join("buildingType");

List < Predicate > predicates = new ArrayList < Predicate > ();
predicates.add(builder.equal(joinBuilderType.get("id"), type.getId()))
predicates.add(builder.in(joinOwner.get("id")).value(ownerIds))
criteria.select(myObjectRoot);
criteria.where(builder.and(predicates.toArray(new Predicate[predicates.size()])));
return entityManager.createQuery(criteria).getResultList();
列出所有者ID//包括您想要的所有者Id
建筑类型//包括您想要的类型
CriteriaBuilder=getSessionFactory().getCurrentSession().getCriteriaBuilder();
CriteriaQuerycriteria=builder.createQuery(Building.class);
RootmyObjectRoot=criteria.from(Building.class);
JoinjoinOwner=myObjectRoot.Join(“所有者”);
JoinjoinBuilderType=myObjectRoot.Join(“buildingType”);
Listpredicates=newarraylist();
add(builder.equal(joinBuilderType.get(“id”),type.getId())
add(builder.in(joinOwner.get(“id”)).value(ownerIds))
条件。选择(myObjectRoot);
其中(builder.and(predicates.toArray(新谓词[predicates.size()]));
返回entityManager.createQuery(条件).getResultList();

说明:

List<Long> ownerIds; //include Id of owners you want
BuildingType type;  //include the type you want 
CriteriaBuilder builder = getSessionFactory().getCurrentSession().getCriteriaBuilder();
CriteriaQuery < Building > criteria = builder.createQuery(Building.class);
Root < Building > myObjectRoot = criteria.from(Building.class);
Join < Building, Owner > joinOwner = myObjectRoot.join("owner");
Join < Building, BuilderType > joinBuilderType = myObjectRoot.join("buildingType");

List < Predicate > predicates = new ArrayList < Predicate > ();
predicates.add(builder.equal(joinBuilderType.get("id"), type.getId()))
predicates.add(builder.in(joinOwner.get("id")).value(ownerIds))
criteria.select(myObjectRoot);
criteria.where(builder.and(predicates.toArray(new Predicate[predicates.size()])));
return entityManager.createQuery(criteria).getResultList();
  • 首先,您需要确保您拥有所有者ID列表,而不是所有者列表
  • 然后,您可以加入owner和BuildingType,并在它们上创建谓词列表
  • 最后在根上选择,该根位于构建实体上

解决方案:

List<Long> ownerIds; //include Id of owners you want
BuildingType type;  //include the type you want 
CriteriaBuilder builder = getSessionFactory().getCurrentSession().getCriteriaBuilder();
CriteriaQuery < Building > criteria = builder.createQuery(Building.class);
Root < Building > myObjectRoot = criteria.from(Building.class);
Join < Building, Owner > joinOwner = myObjectRoot.join("owner");
Join < Building, BuilderType > joinBuilderType = myObjectRoot.join("buildingType");

List < Predicate > predicates = new ArrayList < Predicate > ();
predicates.add(builder.equal(joinBuilderType.get("id"), type.getId()))
predicates.add(builder.in(joinOwner.get("id")).value(ownerIds))
criteria.select(myObjectRoot);
criteria.where(builder.and(predicates.toArray(new Predicate[predicates.size()])));
return entityManager.createQuery(criteria).getResultList();
列出所有者ID//包括您想要的所有者Id
建筑类型//包括您想要的类型
CriteriaBuilder=getSessionFactory().getCurrentSession().getCriteriaBuilder();
CriteriaQuerycriteria=builder.createQuery(Building.class);
RootmyObjectRoot=criteria.from(Building.class);
JoinjoinOwner=myObjectRoot.Join(“所有者”);
JoinjoinBuilderType=myObjectRoot.Join(“buildingType”);
Listpredicates=newarraylist();
add(builder.equal(joinBuilderType.get(“id”),type.getId())
add(builder.in(joinOwner.get(“id”)).value(ownerIds))
条件。选择(myObjectRoot);
其中(builder.and(predicates.toArray(新谓词[predicates.size()]));
返回entityManager.createQuery(条件).getResultList();
我想你可以参考。您应该在给出问题
criteria.where(builder.and(rootBuilding.join(_owner).in(owner),builder.equal(rootBuilding.get(_buildingType),buildingType))之前进行搜索这是我搜索的答案。我想你可以参考。您应该在给出问题
criteria.where(builder.and(rootBuilding.join(_owner).in(owner),builder.equal(rootBuilding.get(_buildingType),buildingType))之前进行搜索这是我搜索的答案。