【问题标题】:Hibernate Criteria Return parent record that have one-to-one child record not null?休眠条件返回具有一对一子记录的父记录不为空?
【发布时间】:2012-10-08 07:07:03
【问题描述】:

我有这样的一对一关系

父母

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

但不行,你能帮我举个例子吗?谢谢

【问题讨论】:

  • 只是出于好奇,您使用 Parent & Child。父母可以有多个孩子吗?如果是这样,您应该在关系的每一端使用 OneToMany 和 ManyToOne 并在标准 API / jpql 中“存在”。

标签: hibernate nhibernate-mapping one-to-one hibernate-criteria


【解决方案1】:

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

现在,为了使您的查询工作,无论映射是什么,您都应该简单地进行内部连接:

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

由于连接是内连接,它只会选择具有非空子的父级。

【讨论】:

  • 嘿,谢谢回复,我已经从父级中删除了 JoinColumn 但不起作用,你能告诉我具体怎么做吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多