标准,如何访问子类属性

时间:2012-07-03 13:15:31

标签: java hibernate criteria criteria-api

奇怪的是,我找不到一些简单的东西,我有2个实体,一个在另一个内部,我的问题是如何从子实体访问一个属性?

实体1

@Getter
@Setter
@Entity
public class ObjectA{
    String name;
    String surname;
    ObjectB B;
}

实体2

@Setter
@Getter
@Entity
ObjectB{
    String family;
    String range;
}

我想要的是通过标准搜索访问familly和range,所以我做到了:

public List<ObjectA> search(String name, String surname, String family, String range) {
    Criteria c = HibernateUtil.getSessionFactory().getCurrentSession().createCriteria(ObjectA.class, "a");

if (!name.equals("")) {
    c.add(Restrictions.eq("a.name", name));
}
if (!surname.equals("")) {
    c.add(Restrictions.eq("a.surname", surname));
}
if (!family.equals("")) {
    c.add(Restrictions.eq("a.B.family", family));
}
if (!range.equals("")) {
    c.add(Restrictions.eq("a.B.range", range));
}
return c.list();

}

可以访问姓名和姓氏,但家庭和范围不能。 '无法解决财产' 我该怎么办?

thanks = D

2 个答案:

答案 0 :(得分:5)

您必须为子类属性创建别名才能访问它。

请查看以下手册http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html

的第15.4节

答案 1 :(得分:2)

在你的情况下,我不确定你需要别名。 要在子实体上请求,您需要在子实体上创建一个条件,然后在其上添加参数:

public List<ObjectA> search(String name, String surname, String family, String range) {
    Criteria aCriteria = HibernateUtil.getSessionFactory().getCurrentSession().createCriteria(ObjectA.class);

if (!name.equals("")) {
    aCriteria.add(Restrictions.eq("name", name));
}
if (!surname.equals("")) {
    aCriteria.add(Restrictions.eq("surname", surname));
}

Criteria bCriteria = aCriteria.createCriteria("B");

if (!family.equals("")) {
    bCriteria.add(Restrictions.eq("family", family));
}
if (!range.equals("")) {
    bCriteria.add(Restrictions.eq("range", range));
}
return aCriteria.list();

注意:aCriteria.createCriteria("B")将使其仅返回具有非ObjectA B的null个对象,因此您可能只想在{family时创建子条件{1}}和range不为空。