Hibernate - 选择Child,然后与Parent一起返回Parent以及其他子项

时间:2015-11-28 10:17:50

标签: java sql database hibernate hql

也许这是基本的东西,但我无法在休眠状态下解决这个问题。

我必须根据某些条件选择一些子记录。

我有一个父实体:

 @Entity
    @DynamicUpdate
    @Table(name = "PARENT", catalog = "MYDB")
    public class Parent implements Serializable {
    ...
        private Set<Child1> child1 = new HashSet< child1>(0);
        private Set<Child2> child2 = new HashSet< child2 >(0);

...
        @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent", cascade = CascadeType.ALL)
        public Set<Child1> getChild1() {
            return child1;
        }

    ...

        @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
        public Set<Child2> getChild2() {
            return child2;
        }
}

并且child1为:

@Entity
@DynamicUpdate
@Table(name = "CHILD1", catalog = "MYDB")
public class Child1 implements Serializable {

...
@ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "ID", referencedColumnName = "ID")
    public Parent getParent() {
        return parent;
    }

现在这里有一对多关系。一个父级可以有许多child1行和许多child2行。 我的问题是选择一些条件很少的child1记录及其父母,但我不希望其他子(child2)与嵌入的父记录一起被提取。

我的sql查询是选择子节点及其父节点:

Select c from Child1 pr join c.parent where c.parent.id IN :ids AND c.createdDate > :time AND c.status = :status

条件运作良好,我也返回了Child1对象。 但返回的Child1记录中的父对象包含所有Child2记录以及包含它的所有其他Child1记录。这根本不需要。

如何确保我只获取所选的Child1记录及其父母......没有额外的内容。我不希望父母与其所有孩子一起归还。

感谢。

3 个答案:

答案 0 :(得分:0)

你可以在你的父母中删除你的孩子名单并尝试..和/或者不要在你的父类中使用它们来尝试这个代码:

@Entity
    @DynamicUpdate
    @Table(name = "PARENT", catalog = "MYDB")
    public class Parent implements Serializable {
        private Set<Child1> child1;
        private Set<Child2> child2;

        @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent", cascade = CascadeType.ALL)
        public Set<Child1> getChild1() {
            return child1;
        }

    ...

        @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
        public Set<Child2> getChild2() {
            return child2;
        }
}

如果它不起作用,请删除您的列表并重试..

答案 1 :(得分:0)

尝试按如下所示更改类Child1的代码,并确保在数据库表中创建了foriegn键列ID

@Entity
@DynamicUpdate
@Table(name = "CHILD1", catalog = "MYDB")
public class Child1 implements Serializable {
    ...
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID", referencedColumnName = "ID")
    private Parent parent;

}

希望这有帮助。

答案 2 :(得分:0)

试试这个:

Parent Class: 

     @Entity
        @DynamicUpdate
        @Table(name = "PARENT", catalog = "MYDB")
        public class Parent implements Serializable {

          @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
            private Set<Child1> child1;
          @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
            private Set<Child2> child2;

            public Set<Child1> getChild1() {
                return child1;
            }

            public Set<Child2> getChild2() {
                return child2;
            }
    }

儿童班:

    @Entity
    @DynamicUpdate
    @Table(name = "CHILD1", catalog = "MYDB")
    public class Child1 implements Serializable {

@ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "ID", referencedColumnName = "ID")
    public Parent parent;


        public Parent getParent() {
            return parent;
        }