java - 如何使用 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 实体信息。有没有办法做到这一点请建议。
解决方案
推荐阅读
- c# - 加载弹出表单交叉线程
- amazon-s3 - 允许使用 Cognito 凭证的请求的 S3 策略:AWS
- javascript - `this` 的属性在 setTimeout 中未定义
- node.js - 错误:已知 npm 不能在 Node.js v 上运行
- google-apps-script - 随机字符串生成器随机化太频繁
- visual-studio-code - VSCode 按名称终止任务
- java - 二叉树节点计算的递归方法
- c# - 无法从“System.Transactions.IsolationLevel”转换为“System.Data.IsolationLevel”
- ios - iOS - 大小类的不同堆栈视图
- c++ - 逆向工程项目到图形 UML 图