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、「Voltage」という名前のパラメーターを持つ「220」のパラメーター値を持つものがあります。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 に答える