假设我有这样的实体:
@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")));
但对我来说似乎有些麻烦。有没有更方便的方法来处理这种关系?
答案 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或其他复杂条件进行分组。