如何创建Hibernate Criteria查询,我必须过滤多个关系?

时间:2012-08-27 15:33:16

标签: hibernate entity-relationship hibernate-criteria

假设我有这样的实体:

@Entity
@Table(name = "ITEMS")
public class Item  {
    @OneToMany(mappedBy = "item")
    private Set<ItemParameterValue> parameterValues;
}

ItemParameterValues

有关系
@Entity
@Table(name = "ITEM_PARAMETER_VALUES", uniqueConstraints = @UniqueConstraint(columnNames = {"item_id", "parameter_id"}))
    public class ItemParameterValue {
        @ManyToOne
        @JoinColumn(name = "parameter_id")
        private ItemParameter parameter;
}

ItemParameter

有关系
@Entity
@Table(name = "ITEM_PARAMETERS", uniqueConstraints = @UniqueConstraint(columnNames = "sid"))
public class ItemParameter {

}

例如,我有一些Item,其参数值为“220”,其参数名为“Voltage”。我必须过滤220但值220可以属于许多参数,我需要属于参数“电压”的那个。

我知道我可以做这样的事情(假设我设置了正确的别名):

Criteria c = session.createCriteria(Item.class);
// ...
c.add(Restrictions.conjunction()
    .add(Restrictions.eq("item.parameterValue", "220"))
    .add(Restrictions.eq("item.parameterValue.parameter.sid", "Voltage")));

但对我来说似乎有些麻烦。有没有更方便的方法来处理这种关系?

2 个答案:

答案 0 :(得分:1)

而不是createalias,您可以使用createcriteria来缩短它

Criteria c = session.createCriteria(Item.class)
    .createCriteria("parameterValues")
        .add(Restrictions.eq("theProperty", "220"))
        .createCriteria("parameter")
            .add(Restrictions.eq("sid", "Voltage"));

答案 1 :(得分:0)

创建适当的别名,使标准更容易:

Criteria c = session.createCriteria(Item.class);
c.createAlias("parameterValues", "pv");
c.createAlias("pv.parameter", "p");
c.add(Restrictions.eq("pv.theProperty", "220")); // I don't see in your question the name of the property to perform filter
c.add(Restrictions.eq("p.sid", "Voltage"));

此外,Restrictions.conjunction()不是必需的,在这种情况下,您不使用OR或其他复杂条件进行分组。