Java 按集合中的条件筛选实体

Java 按集合中的条件筛选实体,java,jpa,spring-data-jpa,Java,Jpa,Spring Data Jpa,简化的问题是: 在一个“a”实体中,有一个“B”实体的集合(来自一个OneToMany关系)并使用CriteriaBuilder,如何从“a”中获取元素,该集合中至少有一个满足条件的元素“B”?(例如,B的属性等于10,或者如另一个示例B所指的属性等于10的另一个实体) 在上下文中: 在我的程序中,我有以下实体 @Entity @SequenceGenerator(name = "sequence", sequenceName = "S_EXPEDIENT") public class Expe

简化的问题是:

在一个“a”实体中,有一个“B”实体的集合(来自一个OneToMany关系)并使用CriteriaBuilder,如何从“a”中获取元素,该集合中至少有一个满足条件的元素“B”?(例如,B的属性等于10,或者如另一个示例B所指的属性等于10的另一个实体)

在上下文中:

在我的程序中,我有以下实体

@Entity
@SequenceGenerator(name = "sequence", sequenceName = "S_EXPEDIENT")
public class Expedient {
  private Long idExpedient
  private Integer numberExpedient
  private Integer yearExpedient
  @ManyToOne
  @JoinColumn(name = "id_chamber")
  private Chamber chamber
  private Integer status
  @OneToMany(cascade = CascadeType.ALL, mappedBy = "expedient")
  private List<HistoricalAssignment> assignments = new ArrayList<HistoricalAssignment>();
  //more fields
}

@SequenceGenerator(name = "sequence", sequenceName = "S_HISTORICAL_ASSIGNMENT ")
@Entity
public class HistoricalAssignment {
  private Long idHistoricalAssignment
  @ManyToOne
  @JoinColumn(name = "id_expedient")
  private Expedient expedient;
  @ManyToOne
  @JoinColumn(name = "id_office")
  private Office office;
  //more fields
}

@SequenceGenerator(name = "sequence", sequenceName = "S_OFFICE")
@Entity
public class Office extends {
  private Long idOffice
  @ManyToOne
  @JoinColumn(name = "id_chamber")
  private Chamber chamber
  //more fields
}

@SequenceGenerator(name = "sequence", sequenceName = "S_CHAMBER")
@Entity
public class Chamber{
  private Long id_chamber
  private String description;;
  //more fields
}
@实体
@SequenceGenerator(name=“sequence”,sequenceName=“S_enquipment”)
公共阶级权宜之计{
专用长idExpedient
私有整数
私人整数权宜之计
@许多酮
@JoinColumn(name=“id\u商会”)
密室
私有整数状态
@OneToMany(cascade=CascadeType.ALL,mappedBy=“方便”)
私有列表分配=新建ArrayList();
//更多领域
}
@SequenceGenerator(name=“sequence”,sequenceName=“S_历史_分配”)
@实体
公共类历史分配{
私人长期派遣
@许多酮
@JoinColumn(name=“id\u便利”)
私利;
@许多酮
@JoinColumn(name=“id\u办公室”)
私人办公室;
//更多领域
}
@SequenceGenerator(name=“sequence”,sequenceName=“S_OFFICE”)
@实体
公营班级办公室扩展{
私人长办公室
@许多酮
@JoinColumn(name=“id\u商会”)
密室
//更多领域
}
@SequenceGenerator(name=“sequence”,sequenceName=“S_CHAMBER”)
@实体
公营班级会议厅{
私人长屋
私有字符串描述;;
//更多领域
}
我还使用Spring数据规范来执行过滤器搜索。 我遇到的问题是,当我试图将所有“权宜之计”至少分配给一个“会议厅”时,因为我必须寻找那些在集合“分配”中至少有一个属于“会议厅”的“办公室”的人


我通过添加更多代码进行编辑。请记住,原始代码具有多个继承级别(此处简化),并且原始模型是西班牙语的:

public class ExpedientSpecification implements Specification<Expedient> {
    private final Integer STATUS_DELETED = -1;
    protected ExpedientFilter criteria;
    protected List<Predicate> predicates = new ArrayList<Predicate>();

    public ExpedientSpecification(ExpedientFilter criteria) {
        this.criteria=criteria;
    }

    public Predicate toPredicate(Root<Expedient> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        //variable filters
        if(criteria.getId() != null){
            predicates.add(cb.equal(root.get("id"), criteria.getId())); 
        }
        if(criteria.getNumberExpedient() != null){
            predicates.add(criteriaBuilder.equal(root.get("numberExpedient"), criteria.getNumberExpedient()));  
        }
        if(criteria.getYearExpedient() != null){
            predicates.add(criteriaBuilder.equal(root.get("yearExpedient"), criteria.getYearExpedient()));  
        }
        //Fixed Filters
        predicates.add(criteriaBuilder.notEqual(root.get("status"), STATUS_DELETED));

        // This is where I need to add the filter. I need to get only those in the "assignments" List have at least one 
        // "Office" that belongs to a "Chamber"

        Predicate returnPredicates = cb.and(predicates.toArray(new Predicate[this.predicates.size()]));
        predicates.clear();
        return returnPredicates;
    }
}
公共类便利规范实现规范{
私有最终整数状态_DELETED=-1;
保护权宜过滤器标准;
受保护列表谓词=new ArrayList();
公共权宜之计规范(权宜之计过滤器标准){
这个。标准=标准;
}
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder cb){
//可变滤波器
if(criteria.getId()!=null){
add(cb.equal(root.get(“id”)、criteria.getId());
}
if(criteria.getNumberExpident()!=null){
add(criteriaBuilder.equal(root.get(“numberExpedient”)、criteria.getNumberExpedient());
}
if(criteria.getYearEquipment()!=null){
add(criteriaBuilder.equal(root.get(“yearphastict”)、criteria.getyearphastict());
}
//固定过滤器
add(criteriaBuilder.notEqual(root.get(“status”),status_DELETED));
//这就是我需要添加过滤器的地方。我只需要让“分配”列表中的那些至少有一个过滤器
//属于“商会”的“办公室”
谓词returnPredicates=cb.and(predicates.toArray(新谓词[this.predicates.size()]);
谓词clear();
返回谓词;
}
}

您是如何执行这些标准的?你能把密码寄出去吗

无论如何,您可以使用标准别名加入oneToMany


示例:
criteria.createAlias(“assignments”、“assignments”),然后从您希望筛选的工作分配中对atributte添加一个限制。

您是如何处理这些条件的?你能把密码寄出去吗

无论如何,您可以使用标准别名加入oneToMany


示例:
criteria.createAlias(“assignments”、“assignments”)然后在您希望筛选的作业中添加一个限制。

谢谢您的回答,但恐怕这不是我需要的。我添加了更多的代码以更加具体。(请记住,原始代码具有多个继承级别,并且原始模型是西班牙语的)感谢您的回答,但恐怕这不是我所需要的。我添加了更多的代码以更加具体。(请记住,原始代码具有多个继承级别,并且原始模型是西班牙语的)我认为解决方案可以使用root.joinList。我一直在调查…我认为解决方案可以使用root.joinList。我一直在调查。。。