休眠条件返回具有一对一子记录的父记录不为null?

发布于 2021-02-01 12:28:08

我有这样的一对一关系

父母

@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"));

但是没有用,请给我一个例子,能帮我吗?谢谢

关注者
0
被浏览
89
1 个回答
  • 面试哥
    面试哥 2021-02-01
    为面试而生,有面试问题,就找面试哥。

    首先,映射是错误的。在父类中,您是说该关联是由映射的child.parent,而在您说该关联是使用名为的连接列进行映射之后id_child。下定决心
    它是由child.parent属性映射的,应该删除@JoinColumn。或者它是由JoinColumn映射的,您应该@PrimaryKeyJoinColumn在子级中删除,并mappedBy="child"在Child实体中使用。

    现在,要使查询正常工作,无论映射是什么,您都应该简单地进行内部联接:

    Criteria criteria = session.createCriteria(Parent.class);
    criteria.createAlias("child"); // inner join
    

    由于联接是内部联接,因此它将仅选择具有非空子代的父母。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看