java - 如何将 IN 与 JPA CriteriaBuilder 结合使用

标签 java jpa

我使用 JPA 并拥有对象 Building 字段 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,但适用于所有者列表什么?

最佳答案

描述:

  • 首先,您需要确保您拥有所有者 ID 列表,而不是列表所有者;
  • 然后您可以加入所有者和 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();

关于java - 如何将 IN 与 JPA CriteriaBuilder 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53168923/

相关文章:

java - 使用 Hibernate 供应商使用计数 JPA 2.0 包装条件查询

java 。关键字<这个>。迭代器模式

java - TransactionAttributeType.REQUIRES_NEW 注释方法会在新线程上运行吗?

java - 如何让一个圆圈不停地移动?

java - 从一个 Bean 创建两个 JPA 表?

java - 如何调用从 JPA 返回值的自定义 Oracle 函数

java.lang.SecurityException AWSCredentialsProvider 签名者信息不匹配

java - Spring云流/Kafka异常

java - EJB3 - @Column(insertable ="false") 问题

java - 基于主查询 JPA Criteria API 创建子查询