簡體   English   中英

OneToMany關系中的Hibernate Criterion

[英]Hibernate Criterion in OneToMany relationship

我試圖找出如何使用hibernate標准來獲取一個特定的子元素集,當我檢索父元素。 我創建了以下示例實體:

家長班

@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中設置了男孩?

我搜索了幾天的解決方案,我有同樣的問題,我有一個帶有一系列traductions的對象,我想用唯一的當前語言查詢一個對象。

我找到了這個解決方案: 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");
Criteria cr = getSession()
            .createCriteria(Parent.class)
            .createAlias("children", "c")
            .createAlias("c.gender", "g");

Criterion Malechild = Restrictions.eq("g.genderInd", "M");

Criterion NFemaleChild = Restrictions.ne("g.genderInd", "F");

LogicalExpression andExp = Restrictions.and(Malechild, NFemaleChild);

cr.add(andExp);

List results = cr.list();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM