【发布时间】:2020-06-16 08:32:38
【问题描述】:
我有一个父实体,它有两个子实体作为属性。 我想从父实体中选择具有给定参数作为个人属性的 childOne 或具有相同给定参数作为个人属性的 childTwo 的所有元素。
这是我简化的三个类:
父对象:
@Entity
public class ParentObject {
@Id
private int id;
private int fkChildOne;
private int fkChildTwo;
@ManyToOne
@JoinColumn(name = "fk_child_one_id", referencedColumnName =
"child_one_id")
private ChildOne childOne;
@ManyToOne
@JoinColumn(name = "fk_child_one_id", referencedColumnName =
"child_one_id")
private ChildTwo childTwo;
// getters and setters
}
子一对象:
@Entity
public class ChildOne {
@Id
private int childOneId;
private String nameChildOne;
@OneToMany
@JoinColumn(name = "fk_child_one_id")
private List<ParentObject> parents;
// getters and setters
}
孩子两个对象:
@Entity
public class ChildTwo {
@Id
private int childOneId;
private String nameChildTwo;
@OneToMany
@JoinColumn(name = "fk_child_two_id")
private List<ParentObject> parents;
// getters and setters
}
规格类:
public static Specification<ParentObject> checkName(String name) {
return Specifications.where(
(root, query, builder) -> {
final Join<ParentObject, ChildOne> joinchildOne =
root.join("childOne");
final Join<ParentObject, ChildTwo > joinchildTwo =
root.join("childTwo");
return builder.or(
builder.equal(joinchildOne .get("nameChildOne"), name),
builder.equal(joinchildTwo .get("nameChildTwo"), name)
);
}
);
}
在我的服务中调用此规范时,我没有得到任何结果。但是,如果我在 builder.or 方法中注释掉两个连接之一和相应的谓词,那么我会得到一些结果,但它们显然与我正在寻找的不匹配,即选择具有带有该参数的 ChildOne 或带有该参数的 ChildTwo。
知道代码有什么问题吗?
【问题讨论】:
-
你能把根实体、汽车实体和你执行提取的方法放在里面吗?
-
@JLazar0 我更新了我的帖子以更清晰。你能注意到问题吗?
-
我看到的第一件事是孩子身上没有“@JoinColumn (name = "COLUMN")”注解。我也没有看到“@Id”注释。实体建模很重要,你是手动做的,你用eclipse吗?您正在研究数据模型吗?
-
@JLazar0 感谢您的回复。我已经用更好的代码更新了这篇文章,因为它确实不完整。我的 builder.or 方法仍然没有得到预期的结果。还有什么建议吗?
标签: jpa criteria-api