如何创建一个Hibernate条件查询,在这里我必须过滤多个关系?

如何创建一个Hibernate条件查询,在这里我必须过滤多个关系?,hibernate,entity-relationship,hibernate-criteria,Hibernate,Entity Relationship,Hibernate Criteria,假设我有这样一个实体: @Entity @Table(name = "ITEMS") public class Item { @OneToMany(mappedBy = "item") private Set<ItemParameterValue> parameterValues; } 它与项参数有关: @Entity @Table(name = "ITEM_PARAMETERS", uniqueConstraints = @UniqueConstraint(co

假设我有这样一个实体:

@Entity
@Table(name = "ITEMS")
public class Item  {
    @OneToMany(mappedBy = "item")
    private Set<ItemParameterValue> parameterValues;
}
它与
项参数
有关:

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

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

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


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

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

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

此外,
限制。连接()是不必要的,在这种情况下,您没有分组,也没有使用ORs或其他复杂条件。

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

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

您有关于Hibernate将根据此条件生成何种查询的一些信息吗?
SELECT item.*from itemtable item join parametervaluetable value on。。。将参数p连接到。。。其中value.thevalue='220'和p.sid='Voltage'
请注意,尽管集合已合并,但它们并未初始化,因为已设置筛选器,并且未返回所有子集合
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"));
Criteria c = session.createCriteria(Item.class)
    .createCriteria("parameterValues")
        .add(Restrictions.eq("theProperty", "220"))
        .createCriteria("parameter")
            .add(Restrictions.eq("sid", "Voltage"));