0

假设我有一个这样的实体:

@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")));

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

4

2 回答 2

1

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

Criteria c = session.createCriteria(Item.class)
    .createCriteria("parameterValues")
        .add(Restrictions.eq("theProperty", "220"))
        .createCriteria("parameter")
            .add(Restrictions.eq("sid", "Voltage"));
于 2012-08-28T13:31:06.603 回答
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()没有必要,在这种情况下,您没有将 AND 与 OR 或其他复杂条件分组。

于 2012-08-28T12:32:50.680 回答