4

2つのエンティティ(DatasetItem)があり、最初のエンティティには後者のリストが含まれています。

@Entity
class Dataset {
    @Id long id;
    List<Item> items;
}

@Entity
class Item {
    @Id long id;
    @Temporal Date date;
    String someCriteria;
}

現在、データセットのリストで最も古いアイテムとしてsomeCriteria ='x'を持つアイテムを参照するデータセットを探しています(このデータセットによって参照される他のすべての日付よりも前の日付です)。

これはJPA-2.0のCriteriaAPIで機能するはずですが、SQLクエリとしての答えも問題ありません。

現在の状況は次のとおりです。

Subquery<Item> _subquery = p_criteria.subquery(Item.class);
Root<Item> _itemRoot = _subquery.from(Item.class);
_subquery.select(_itemRoot);

// correlate
_subquery.correlate(_datsetRoot);

// type check
Predicate _typeP = p_builder.equal(_itemRoot.get(Item_.someCriteria), "x");

<additional predicates>
...

// reference check
_subquery.where(_typeP);

return p_builder.exists(_subquery);

サブクエリの作成については、日付順に並べて、最初のサブクエリを確認します。残念ながら、JPA-2.0ではサブクエリ(または結合)での順序付けは許可されていません(私が見る限り)。私の2番目のアイデアはMAX(date)、を取得することでした。これは、ほとんどのデータベースでサポートされているはずです。ここでも同じことが言えます。MAX、ABS、...のサポートは数字でのみ利用できます。

編集:並べ替えられたサブクエリを使用すると、次のようになります(MSSQL):

SELECT d.id
FROM Dataset d
WHERE EXISTS (
 SELECT TOP 1 *
 FROM Item i
 WHERE i.dataset_id = d.FALL_ID
    AND i.someCriteria = 'x'
 ORDER BY i.date
)
ORDER BY d.FALL_ID

(どのように)JPA-2.0でこれを行うことができますか?

4

1 に答える 1

6

Java 1.6 には、java.util.Date フィールドに対して機能するメソッドCriteriaBuilder.least(expression)( の代わりにmin()) およびCriteriaBuilder.lessThanOrEqualTo(expressionA, expressionB)( の代わりに) があります。le()

Java 1.5 では、DB にフィールドを追加しないと実現できないようです。

于 2010-11-24T11:09:55.950 に答える