私は、次の永続クラスがあります。使用Hibernateの基準
public class Code {
@ElementCollection(targetClass = CodeValue.class)
@MapKeyClass(CodeProperty.class)
@JoinTable(name="code_properties")
@CreateIfNull(value = false)
private Map<CodeProperty,CodeValue> propertiesMap =
new HashMap<CodeProperty, CodeValue>();
...
}
public class CodeProperty {
private String name;
...
}
public class CodeValue {
private String value;
...
}
をそして私は、私はpropertiesMapを持っているいくつかのプロパティによってフィルタリングコードのリストを取得しようとしている(たとえば、私は、次の基本基準を使用している「色」という名前のプロパティの値が「緑」を持っているコード
:。
Criteria criteria = currentSession()
.createCriteria(Code.class, "code")
.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
私は(提案hereなど)の収集フィルタを実行しようとすると:
org.hibernate.QueryException: could not resolve property: foo of: com.example.CodeValue
、私は本当に、なぜ理解して冬眠していないことを意味することを検討している:
criteria.createAlias("code.properties", "p");
criteria.add(Restrictions.eq("p.foo", "test1"));
criteria.setFetchMode("code.properties", FetchMode.JOIN);
criteria.list();
私は次のエラーを取得しますcode.propertiesはの代わりにCodeValueです !!!
エイリアスを作成せずにこのフィールドにアクセスしようとしましたが、この方法では、正しいコードクラスにアクセスしているようです。私はproperties.indeces(hereが示唆したように)使用:
criteria.add(Restrictions.eq("properties.indeces", "foo"));
criteria.list();
をしかし、これで私は次のエラーを取得する:
could not resolve property: properties.indeces of: com.example.Code
は、誰かがいただきました間違った理解私を助けることはできますか?色の緑でコードを検索するための正しいCriteriaクエリは何でしょうか?
the Github project that demonstrates this problemをチェックアウトすることができます。
おかげ
@MapKeyClassでJPA 2.1の機能を使用していることがわかりました。 JPA Criteria APIではなく廃止予定のHibernate Criteria APIの使用に拘束されていますか? – Naros
@Narosがmicdcarに代わって答える - はい、残念なことに、sessionfactory構成全体をentitymanagerに切り替えることを意味しますが、これは簡単な通知ではありません。私たちはhibernate基準を返すcreateCriteriaに縛られています。 – mmalmeida