0

私はHibernateHQLクエリを持っていますが、これは完全に機能しているようですが、現在Hibernate Criteria APIで少し実験しており、CriteriaAPIで同じHQLクエリを表現したいと思います。この特定の例では、HQLクエリに2つの結合があり、2番目の結合は最初の結合のエイリアスを使用します。CriteriaAPIと同じものを実現したいと思います。これは可能ですか?

元のクエリは次のとおりです。

select mt 
from MessageThread mt 
  inner join mt.messageThreadsStatuses ts 
  inner join ts.threadLocations tl 
where ts.user.userId = :userId and tl = 0";

これが書き直されたクエリですが、私には機能しません:

Criteria c = sf.getCurrentSession().createCriteria(MessageThread.class) 
    .createAlias("messageThreadsStatuses", "ts").setFetchMode("ts", FetchMode.JOIN)
    .createAlias("ts.threadLocations", "tl").setFetchMode("tl", FetchMode.JOIN)
    .add(Restrictions.eq("ts.user.userId", userId))
    .add(Restrictions.eq("tl", 0));

たとえば、2番目のエイリアスを次のように定義しようとしました。

.createAlias("threadLocations", "tl").setFetchMode("tl", FetchMode.JOIN)

しかし、成功しませんでした。

4

1 に答える 1

0

次のドキュメントhttp://billingb.livejournal.com/34266.htmlに示されているとおり:

エイリアスと作成した各条件オブジェクトを使用すると、これらの問題を簡単に解決できます。大きな間違いは、ほとんどの例がすべての基準の作成を連鎖させて示していることだと思いますが、それらを引き離すと、すべてが理解しやすくなります。私が思いついたソリューションコードは次のようになります。

Criteria c = session.createCriteria(Parameter.class);
Criteria cx = c.createCriteria("masterCollections");
cx.createAlias("datasetEntry", "de");
cx.createAlias("parameters", "par");
c.add(Restrictions.or(Restrictions.in("de.datasetId",datasetIDList), Restrictions.in("par.parameterId", parameterIDList)));
于 2012-08-24T08:17:29.160 に答える