25

3 つのテーブル (Associate、Update、および Detail) からいくつかのオブジェクトを取得する条件を作成しようとしています。Detail には Associate と Update への参照があり、Update には Details のリストへの参照があります。私の目的は、アソシエイト ID を指定して、指定されたフィールドに null 値を持つ少なくとも Detail を持つ Updates のリストを取得することです。JPQL では簡単に実行できましたが、クライアントはこれを基準でコーディングする必要があると言いました。

私のJPQLは:

public List<Update> getUpdates(long associateId) {
    TypedQuery<Update> query = em.createQuery("select distinct u from Update u, Detail dt, Associate a "
        + "where dt.update = u and dt.associate = a and a.associateId = :id and "
        + "dt.ack_date is null", Update.class);
    query.setParameter("id", associateId);
    return query.getResultList();
}

次のことを試しましたが、データベース内のすべての更新が返されました。

public List<Update> getUpdates(long associateId) {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Update> query = builder.createQuery(Update.class);

    Root<Update> fromUpdates = query.from(Update.class);
    Root<Associate> fromAssociate = query.from(Associate.class);
    Root<Detail> fromDetail = query.from(Detail.class);

    Join<Detail, Associate> associateJoin = fromDetail.join("associate");
    Join<Detail, Update> updateJoin = fromDetail.join("update");

    TypedQuery<Update> typedQuery = em.createQuery(query

            .select(fromUpdates)
            .where(builder.and(
                    builder.equal(fromAssociate.get("associateId"), associateId),
                    builder.equal(fromDetail.get("associate"), associateJoin),
                    builder.equal(fromDetail.get("update"), updateJoin),
                    builder.isNull(fromDetail.get("ack_date"))
            ))

            .orderBy(builder.asc(fromUpdates.get("updateId")))
            .distinct(true)
    );

    return typedQuery.getResultList();
}

誰でも私を助けることができますか?検索しましたが、3 つのエンティティの例が見つかりません。

4

3 に答える 3