首页 > 解决方案 > 如何使用 Hibernate 中的 Root 元素从父实体中选择子属性

问题描述

我正在处理具有多个子实体的主实体。我要求使用主实体中的根元素来选择子元素。让我发布实体结构

public class MasterEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private BigInteger masterId;

private String masterNumber;


private Integer masterName;

private boolean MasterFlag;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "as_slave1_account_id")
private MappingFirst mappingFirst;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "as_slave2_account_id")
private MappingSecond mappingSecond;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "as_slave3_account_id")
private MappingThird mappingThird;




@PrePersist
private void prePersist() {
    if (this.createdOn == null) this.createdOn = OffsetDateTime.now();
}

@PreUpdate
private void preUpdate() {
    this.lastModifiedOn = OffsetDateTime.now();
}


}

第一个子实体

public class MappingFirst  {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long mappingFirstId;

@NotNull(message = "account_number can't be null")
private String accountNumber;

@ManyToOne( fetch = FetchType.EAGER )
@JoinColumn( name = "as_drill_down_id", referencedColumnName = "asDrillDownId")
@NotNull
private DrilDownOne drilDownOne;
    
}

第二个子实体

public class DrilDownOne{

@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
private long asDillDownId;

}

我正在发布我试图从根中提取元素的类

public class MasterElementSearchCriteria implements Consumer<SearchCriteria> {
private Predicate predicate;
private CriteriaBuilder builder;
private Root rootElement;

@Override
public void accept(SearchCriteria param) {

    if (param.getValue() != null && param.getValue() != "") {
        if (param.getOperation().equalsIgnoreCase(CriteriaOperationEnum.GREATER_THAN_OR_EQUAL_TO.getOperation())) {
            if (rootElement.get(param.getKey()).getJavaType() == LocalDate.class) {
                predicate = builder.and(predicate, builder.greaterThanOrEqualTo(rootElement.get(param.getKey()).as(LocalDate.class), (LocalDate) param.getValue()));
            } else {
                predicate = builder.and(predicate, builder.greaterThanOrEqualTo(rootElement.get(param.getKey()), param.getValue().toString()));
            }
        } else if (param.getOperation().equalsIgnoreCase(CriteriaOperationEnum.LESSER_THAN_OR_EQUAL_TO.getOperation())) {
            if (rootElement.get(param.getKey()).getJavaType() == LocalDate.class) {
                predicate = builder.and(predicate, builder.lessThanOrEqualTo(rootElement.get(param.getKey()).as(LocalDate.class), (LocalDate) param.getValue()));
            } else {
                predicate = builder.and(predicate, builder.lessThanOrEqualTo(rootElement.get(param.getKey()), param.getValue().toString())); // Here i am pulling the element from the root , but here i want to pull the asDillDownId of the  DrilDownOne Entity
            }
        } else if (param.getOperation().equalsIgnoreCase(CriteriaOperationEnum.EQUALS_IGNORE_CASE.getOperation())) {
            if (rootElement.get(param.getKey()).getJavaType() == String.class) {
                predicate = builder.and(predicate, builder.like(builder.upper(rootElement.get(param.getKey())), CriteriaOperationEnum.LIKE.getOperation() + param.getValue().toString().toUpperCase() + CriteriaOperationEnum.LIKE.getOperation()));
            } else {
                predicate = builder.and(predicate, builder.equal(rootElement.get(param.getKey()), param.getValue()));
            }
        } else if (param.getOperation().equalsIgnoreCase(CriteriaOperationEnum.LIKE.getOperation())) {
            predicate = builder.and(predicate, builder.like(builder.upper(rootElement.get(param.getKey())), CriteriaOperationEnum.LIKE.getOperation() + param.getValue().toString().toUpperCase() + CriteriaOperationEnum.LIKE.getOperation()));
        }
    }
}

public Predicate getPredicate() {
    return predicate;
}
}

我的要求是,我想使用 Root 元素提取 DrilDownOne 实体信息。有没有办法做到这一点请建议。

标签: javahibernatejpaentityhibernate-criteria

解决方案


推荐阅读