【问题标题】:Criteria, how to access a subclass property标准,如何访问子类属性
【发布时间】:2012-07-03 13:15:31
【问题描述】:

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

实体 1

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

实体 2

@Setter
@Getter
@Entity
ObjectB{
    String family;
    String 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();

}

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

谢谢=D

【问题讨论】:

    标签: java hibernate criteria criteria-api


    【解决方案1】:

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

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

    【讨论】:

    • 这个文档没用 :c (已经看过了)。他们确实解释了如何制作别名,但没有显示实体实现。例如,小猫代表什么?这是子类的名字吗?
    • Kittens 是映射到 Cat 类的元素集合。在您的情况下,它类似于: if (!family.equals("")) { c.createAlias("B","B"); c.add(Restrictions.eq("a.B.family", family)); }
    • 感谢它的帮助,最后,这样做有效:c.createAlias("a.B", "subB").add(Restrictions.eq("subB.family", family));
    【解决方案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 具有非 null B 的对象将被返回,因此您可能希望仅在 familyrange 时创建子条件不为空。

    【讨论】:

    • 这基本上只是创建相同事物的另一种方式。使用 createAlias() 代码更干净恕我直言
    • 我倾向于仅在两个不同的子实体之间需要标准时才使用别名。主要是因为我发现子标准语法更简单。
    • 我非常同意塞巴斯蒂安 +1 的意见
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 2013-03-24
    相关资源
    最近更新 更多