27

このコードを約 2 時間理解しようとしています。たとえば、以下のクラスでは、これらのフィールドは何を表しているのでしょうか?

import java.util.Date;
import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
import java.util.UUID;

@StaticMetamodel(Address.class)
public class Address_ extends  {
    public static volatile SingularAttribute<Address, Long> id;
    public static volatile SingularAttribute<Address, UUID> personId;
    public static volatile SingularAttribute<Address, Person> person;
}

これAddress.classは、次の定義を持つ Java クラスです。

@Entity
@Table(name = "address", schema = "public")
public class Address{
    private Long id;
    private Person person;
    private UUID personId;
    //....
}

@StaticMetamodelとの@SingularAttribute注釈が何に使用されるか説明していただけますか? 単純かもしれませんが、私には理解できません。

4

2 に答える 2

27

ドキュメントに従って:

静的メタモデルは、ドメイン モデル内のエンティティと埋め込み可能オブジェクトを「ミラーリング」し、ミラーリングされたクラスの属性に関するメタデータへの静的アクセスを提供する一連のクラスです。

静的メタモデルには次のプロパティがあります。

  • package 内のマネージ クラスごとXに、package内pのメタモデル クラスが作成されます。X_p
  • の型が であるclassyによって宣言されたすべての永続的な非コレクション値属性について、メタモデル クラスには次のような宣言が含まれている必要があります。XyY

SingularAttribute例:

public static volatile SingularAttribute<X, Y> y;

静的メタモデルは、JPA の Criteria API を使用してタイプ セーフなクエリを作成する場合に役立ちます。

たとえば、次の 2 つのエンティティOrderItem:

@Entity
public class Order {
    @Id 
    @GeneratedValue
    Integer id;

    @ManyToOne 
    Customer customer;

    @OneToMany 
    Set<Item> items;

    BigDecimal totalCost;

    // accessors
}

およびItemエンティティ:

@Entity  
public class Item { 
    @Id
    @GeneratedValue
    Integer id;

    int quantity;

    @ManyToOne
    Order order;

    // accessors
}

Criteria API を使用して作成されたタイプセーフな条件クエリを次に示します。

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
SetJoin<Order, Item> itemNode = cq.from(Order.class).join(Order_.items);
cq.where(cb.equal(itemNode.get(Item_.id), 5)).distinct(true);

Item_.idとの使い方に注意してくださいOrder_.item。これらは静的なメタモデル プロパティ (エンティティ プロパティを反映する) に静的にアクセスし、この方法でクエリが適切に構築されるようにします。

于 2013-10-31T10:55:35.387 に答える