1

Java 6、JPA 2.1、および Hibernate 4.3.6.Final を使用しています。組織オブジェクトを見つける以下のコードがあります…

    final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    final CriteriaQuery<Organization> criteria = builder.createQuery(Organization.class);
    final Root<Organization> root = criteria.from(Organization.class);

    final CriteriaQuery query = buildCriteriaQuery(builder, criteria, root, country, state, organizationTypes, parentOrg, zipCode);
    final TypedQuery<Organization> typedQuery = entityManager.createQuery(query);
    if (page != null && pageSize != null)
    {
        int first = (page - 1) * pageSize;
        typedQuery.setFirstResult(first);
        typedQuery.setMaxResults(pageSize);
    }   // if
    return typedQuery.getResultList();

これらの組織オブジェクトは、データ集約型のオブジェクトです。組織のフィールドのサブセットのみを含むデータ転送オブジェクト OrganizationDto があります。組織オブジェクトの代わりに OrganizationDto オブジェクトを設定するように上記を構成する方法はありますか? 私が避けたいのは、結果セットを取得してから for ループを記述して、そのすべてを処理し、すべてのデータ転送オブジェクトを作成することです。クエリが何らかの形でこれらのデータ転送オブジェクトをすぐに入力できれば素晴らしいことです。

4

1 に答える 1

3

JPA 2.1 仕様でコンストラクター式と呼ばれるものの例がいくつかあります。これにより、クエリは任意の pojo のコンストラクターを使用してインスタンスを返すことができます。コンストラクターは、選択リストをパラメーターとして受け取る必要があります。JPQL を使用して記述された仕様の例:

"SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.quantity)
FROM Customer c JOIN c.orders o
WHERE o.quantity > 100"

次のようなタイプ クエリで作成されます。

CriteriaQuery<CustomerDetails> q =
cb.createQuery(CustomerDetails.class);
Root<Customer> c = q.from(Customer.class);
Join<Customer, Order> o = c.join(Customer_.orders);
q.where(cb.gt(o.get(Order_.quantity), 100));
q.select(cb.construct(CustomerDetails.class,
 c.get(Customer_.id),
 c.get(Customer_.status),
 o.get(Order_.quantity)));

ID、ステータス、および数量フィールドを取得するための CustomerDetail のコンストラクターが存在すると仮定すると、クエリはエンティティではなくこれらのインスタンスを返します。

于 2015-08-28T00:52:35.300 に答える