5

私はJPA(休止状態)で次の関係を持っています。

オブジェクトXには、YとZの2つのサブクラスがあります。

オブジェクトAはオブジェクトXに対してmanyToOne関係を持っています(これは一方的な関係であるため、オブジェクトXはオブジェクトAを見ることができません)。

ここで、オブジェクトAの列の最大値を取得したいのですが、関係が特定のサブタイプ、つまり...Yである場合のみです。

つまり、これは、Yと関係があるAのすべてのインスタンスにわたって、オブジェクトAのcolumn1の最大値を取得することと同じです。これは可能ですか?クエリの仕方が少し迷っています。

私は次のようなことを考えていました:

String query = "SELECT MAX(a.columnName) FROM A a join a.x;
Query query = super.entityManager.createQuery(query);
query.execute();

しかし、それはXのサブクラスを考慮に入れていません...だから私は少し迷っています。

どんな助けでも大歓迎です。

4

2 に答える 2

14

JPA 2.0 では、TYPE 演算子を使用して、クエリでポリモーフィック クエリから返されるクラスを制限できます。JPA 2.0 仕様から:

4.6.17.4 エンティティ型式

エンティティ タイプの式を使用して、クエリのポリモーフィズムを制限できます。TYPE 演算子は、引数の正確な型を返します。

エンティティ タイプ式の構文は次のとおりです。

entity_type_expression ::=
         type_discriminator |
         entity_type_literal |
         input_parameter
type_discriminator ::=
         TYPE(identification_variable |
                single_valued_object_path_expression |
                input_parameter )

entity_type_literalは、エンティティ名によって指定されます

エンティティーの Java クラスは、エンティティー・タイプを指定するための入力パラメーターとして使用されます。

例:

SELECT e
FROM Employee e
WHERE TYPE(e) IN (Exempt, Contractor)

SELECT e
FROM Employee e
WHERE TYPE(e) IN (:empType1, :empType2)

SELECT e
FROM Employee e
WHERE TYPE(e) IN :empTypes

SELECT TYPE(e)
FROM Employee e
WHERE TYPE(e) <> Exempt

JPA 1.0 はそのようなメカニズムを提供しないため、JPA 1.0 を使用している場合、標準の JPQL を使用してこれを行うことはできません。

独自の HQL を使用してもかまわない場合は、特殊なプロパティを使用できますclass

同様に、特別なプロパティclassは、ポリモーフィック永続性の場合にインスタンスの識別子の値にアクセスします。where 句に埋め込まれた Java クラス名は、その識別子の値に変換されます。

from Cat cat where cat.class = DomesticCat

あなたの場合、私はそのようなことを試してみます:

SELECT MAX(a.columnName) FROM A a where a.x.class = Y
于 2010-06-02T14:13:52.040 に答える
0

私はそれをテストしていませんが、次のようなことを試してください:

SELECT MAX(a.columnName) FROM A 結合 ax WHERE axclass = y.class

お役に立てば幸いです、アントン

于 2010-06-02T13:46:30.693 に答える