Java 按集合中的条件筛选实体
简化的问题是: 在一个“a”实体中,有一个“B”实体的集合(来自一个OneToMany关系)并使用CriteriaBuilder,如何从“a”中获取元素,该集合中至少有一个满足条件的元素“B”?(例如,B的属性等于10,或者如另一个示例B所指的属性等于10的另一个实体) 在上下文中: 在我的程序中,我有以下实体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
@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。我一直在调查。。。