我有这样的一对一关系
父母
@JsonAutoDetect @Entity @Table(name = "Parent") public class Parent{ private Integer id; private Child child; @Id @GeneratedValue(strategy= GenerationType.AUTO) @Column (name="idparent") public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "parent") @JoinColumn(name="idchild", nullable=true) public Child getChild() { return child; } public void setChild(Child child) { child.setParent(this); this.child = child; } }
和孩子
@JsonAutoDetect @Entity @Table(name="Child") public class Child{ private Integer id; private Parent parent; @Id @GeneratedValue(generator = "foreign") @GenericGenerator(name = "foreign", strategy = "foreign", parameters = { @Parameter(name = "property", value = "parent") }) @Column (name = "idchild") public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @OneToOne(fetch = FetchType.LAZY, optional = true) @Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE }) @PrimaryKeyJoinColumn @JsonIgnore public Parent getParent() { return parent; } public void setParent(Parent parent) { this.parent= parent; }
}
我想创建返回具有孩子isNotNull的父母的条件,我尝试过像
Criteria criteria = session.createCriteria(Parent.class); criteria.add(Restrictions.isNotNull("child"));
但是没有用,请给我一个例子,能帮我吗?谢谢
首先,映射是错误的。在父类中,您是说该关联是由映射的child.parent,而在您说该关联是使用名为的连接列进行映射之后id_child。下定决心 它是由child.parent属性映射的,应该删除@JoinColumn。或者它是由JoinColumn映射的,您应该@PrimaryKeyJoinColumn在子级中删除,并mappedBy="child"在Child实体中使用。
child.parent
id_child
@JoinColumn
@PrimaryKeyJoinColumn
mappedBy="child"
现在,要使查询正常工作,无论映射是什么,您都应该简单地进行内部联接:
Criteria criteria = session.createCriteria(Parent.class); criteria.createAlias("child"); // inner join
由于联接是内部联接,因此它将仅选择具有非空子代的父母。