【问题标题】:How to use IN with JPA CriteriaBuilder如何在 JPA CriteriaBuilder 中使用 IN
【发布时间】:2019-04-09 16:05:15
【问题描述】:

我使用 JPA 并有对象 Building whit 字段 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 ) );

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

【问题讨论】:

  • 我想你可以参考this。您应该在给出问题之前进行搜索
  • criteria.where(builder.and(rootBuilding.join(_owner).in(owners),builder.equal( rootBuilding.get( _buildingType ), buildingType ))); 这是我要寻找的答案。

标签: java jpa


【解决方案1】:

说明:

  • 首先,您需要确保拥有所有者 ID 列表,而不是列表所有者;
  • 然后您可以同时加入 owner 和 BuildingType 并在它们上创建谓词列表。
  • 最后选择Building实体上的根

解决方案:

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();

【讨论】:

    猜你喜欢
    • 2012-03-08
    • 1970-01-01
    • 2019-04-10
    • 2021-04-27
    • 1970-01-01
    • 2018-06-08
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多