我试图弄清楚在检索父级时如何使用休眠条件获取一组特定的子元素。我创建了以下示例实体:

父类

@Entity
public class Parent {
    @Id
    @Column(name="PARENT_ID")
    private long parentId;

    @Column(name="NAME")
    private String name;

    @OneToMany(mappedBy="parent")
    private Set<Child> children
}

儿童班
@Entity
public class Child {
    @Id
    @Column(name="CHILD_ID")
    private long childId

    @ManyToOne
    @JoinColumn(name="PARENT_ID")
    private Parent parent;

    @ManyToOne
    @JoinColumn(name="GENDER_ID")
    private Gender gender;
}

性别类别
@Entity
public class Gender {
    @Id
    @Column(name="GENDER_ID")
    private long genderId;

    @Column(name="GENDER_IND")
    private String genderInd;
}

休眠标准
getSession()
    .createCriteria(Parent.class)
    .createAlias("children", "c")
    .createAlias("c.gender", "g")
    .add(Restrictions.eq("g.genderInd", "M"))
    .list()

此标准为我提供了一个育有男性(“M”)子女的父母的清单,并且该清单返回了每个父母的所有子女。我如何获得有一个男生的父母的列表,并且仅在Parent.children中设置了男生?

最佳答案

我花了几天的时间寻找解决方案,遇到了同样的问题,我的一个对象带有一组翻译,并且我想用唯一的当前语言查询一个对象。

我找到了这个解决方案:
https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/filters.html

为我工作,这里为您提供解决方案:

@Entity
public class Parent {
    @Id
    @Column(name="PARENT_ID")
    private long parentId;

    @Column(name="NAME")
    private String name;

    @OneToMany(mappedBy="parent")
    @Filter(name="gender", condition="gender.genderInd=:gender")
    private Set<Child> children
}

@Entity
@FilterDef(name="genderFilter", parameters=@ParamDef( name="gender", type="string" ) )
public class Child {
    @Id
    @Column(name="CHILD_ID")
    private long childId

    @ManyToOne
    @JoinColumn(name="PARENT_ID")
    private Parent parent;

    @ManyToOne
    @JoinColumn(name="GENDER_ID")
    private Gender gender;
}

在进行查询之前:
Session session = sessionFactory.getCurrentSession();
session.enableFilter("genderFilter").setParameter("gender", "M");

10-07 19:52
查看更多