コレクションテーブルのHibernate criteriaクエリ?
@Entity
@Table(name = "rule")
public class Rule implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "rule_id")
private Long id;
@ElementCollection(targetClass = Action.class)
@CollectionTable(name = "rule_action", joinColumns = @JoinColumn(name = "rule_id"))
@Enumerated(value = EnumType.STRING)
@Column(name = "action")
private Set<Action> actions;
//After editing as per jbrookover's suggestion adding a new mapping
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "rule_id")
private Set<RuleAction> ruleActions;
}
次は私のアクションです
public enum Action {
PHONE, EMAIL, POSTAL,PHONE_OR_EMAIL, SMS;
}
特定のアクションセットを持つルールのリストを表示したい これを試しています
DetachedCriteria criteria = DetachedCriteria.forClass(Rule.class,"rule");
criteria = criteria.createAlias("rule.actions", "action");
criteria.add(Restrictions.in("action.name",actionSet));
return getHibernateTemplate().findByCriteria(criteria);
org.hibernate.MappingException:コレクションは関連付けではありません。例外..
EDIT したがって、jbrookoverからのガイダンスの後、RuleActionという名前のActionのラッパークラスを試してみました。そしてoneToManyをeshtablishできました関係、また私は次のようにクエリを変更しました。
Set<Action> act = new HashSet<Action>();
act.add(Action.EMAIL);
act.add(Action.POSTAL);
DetachedCriteria criteria = DetachedCriteria.forClass(Rule.class);
criteria.add(Restrictions.eq(SUPPORT_LANG, Language.valueOf("EN")))
.createCriteria("ruleActions").add(Restrictions.in("action",act));
return getHibernateTemplate().findByCriteria(criteria);
しかし、これはEMAILまたはPOSTALのいずれかを持つすべてのルールを返しますが、私が望むのはです。クエリを変更します。
hi jbrookover ..thanks !!私はラッパークラスを進めようとしています。私が行っていることに応じてあなたの答えを変更しました。同じ問題に直面する可能性のある他の人を助けるかもしれません。 –
@AnupamGupta制限付きクエリを含むように更新されました。 – jbrookover
おかげさまで@jbrookover今のところ私はHql..andを使い、あなたの提案に応じてすぐにあなたの提案を変更しますので、ここで更新する予定ですので、他の人にとって参考になるかもしれません –