整数IDと日付の複合キーといくつかの追加列を持つ、休止状態にマップされたテーブル「Quote」があります。DetachedCriteria を使用して、最大の日付を持つ各 ID の行を取得する基準クエリを作成したいと思います。
SQLでは、次のようなクエリを書くかもしれません
SELECT * FROM Quote q1
INNER JOIN (SELECT id, max(date) as maxdate FROM Quote
GROUP BY id, date) q2
ON q1.id = q2.id AND q1.date = q2.maxdate
hibernate では、このような「group by」サブクエリの DetachedCriteria を作成できると思います (ここで、Quote はテーブルをマッピングするクラスであり、「Qid」はキーの複合 ID クラスであり、プロパティ ID と日付があり、 Quote クラスの「qid」プロパティ):
DetachedCriteria maxDateQry = DetachedCriteria.forClass(Quote.class);
maxDateQry.setProjection(
Projections.projectionList()
.add(Projections.max("qid.date", "maxdate"))
.add(Projections.groupProperty("qid.id")));
ただし、上記の sql の外側の部分と同等の基準クエリでこれを使用する方法がわかりません。私はラインに沿って何かを探しています
Criteria criteria = session.createCriteria(Quote.class);
criteria.add(
Restrictions.and(
Property.forName("qid.id").eq(maxDateQry???),
Property.forName("qid.date").eq(maxDateQry???)));
List<Quote> quoteList = criteria.list();
上記の 2 つの Property.forName は、外部テーブルをサブクエリの対応する列に関連付けます。内部結合が 1 つの値しか提供しない場合、DetachedCriteria に単一の Projection を指定し、DetachedCriteria を直接 Property.forName(...).eq(..) に渡します。Projection で 2 つの値 (id と maxdate) を持つ DetachedCriteria を使用する方法がわかりません。