2

JPA基準を使用しようとして本当にイライラしています(私はHibernate実装を使用しています).選択がオブジェクトのセットにあるクエリを作成したいのですが、それを機能させることができません..

これが私のコードです:

public List<Object> findAllTypeGroupes(){
    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Object> criteriaQuery =  criteriaBuilder.createQuery(Object.class);

    /* FROM */
    Root<Contact> contactRoot = criteriaQuery.from(Contact.class);
    /* SELECT */
    criteriaQuery.select( contactRoot.get( Contact_.groupes ) );

    return entityManager.createQuery(criteriaQuery).getResultList();
}

@StaticMetamodel(Contact.class)
public abstract class Contact_ {
    public static volatile SingularAttribute<Contact, Integer> contactId;
    public static volatile SetAttribute<Contact, TypeGroupe> groupes;
}

「グループ」がセットである「Contact_.groupes」を選択しようとすると (メタモデル: 「SetAttribute」を参照)、List> を取得することを期待していましたが、実際には平坦化されたリスト List を取得しています。リストの各アイテム/セットのクエリを取得することを期待していたときに、Hibernate は実際には 1 つの単一の SQL クエリを生成しています....

しかし、私が最初に望んでいたのは、複数選択でクエリを作成していくつかのフィールドを取得することでした。そのうちの1つは私のセットです..「Contact_.groupes」で複数選択を作成しようとすると、たとえば「Contact.contactId」ここ:

public List<Object[]> findAllWrapperByCriteria(ContactCriteria criteria){
    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Object[]> criteriaQuery = criteriaBuilder.createQuery(Object[].class);

    /* FROM */
    Root<Contact> contactRoot = criteriaQuery.from(Contact.class);

    criteriaQuery.multiselect( contactRoot.get( Contact_.contactId ), contactRoot.get( Contact_.groupes ) );


    return entityManager.createQuery(criteriaQuery).getResultList();
}

Hibernate が不適切な SQL クエリを生成したため、今回は例外が発生しました。

select contact0_.CONTACT_ID as col_0_0_, . as col_1_0_, typegroupe2_.TYPE_GROUPE_ID as TYPE1_6_, typegroupe2_.LIBELLE as LIBELLE6_, typegroupe2_.MUT_TS as MUT3_6_, typegroupe2_.MUT_USER as MUT4_6_, typegroupe2_.REMARQUE as REMARQUE6_, typegroupe2_.VISIBLE as VISIBLE6_ from CONTACT contact0_ inner join CONTACT_GROUPE groupes1_ on contact0_.CONTACT_ID=groupes1_.CONTACT_ID inner join TYPE_GROUPE typegroupe2_ on groupes1_.GROUPE_TYPE_GROUPE_ID=typegroupe2_.TYPE_GROUPE_ID

ご覧のとおり、最初のコンマの直後にある ". as col_1_0_" は、有効な SQL クエリではありません。

だから私は本当に私がやりたいことをする方法がわかりません.. 私のオブジェクト Contact では、すべてのフィールドが熱心です。レイジーロード。しかし、私はすべての連絡先フィールドのサブセットを表示している「検索画面」を持っています..パフォーマンスを劇的に向上させるために、私はこの部分に特定のクエリを作成し、「SELECT」の代わりに必要なものだけをロードしました* FROM コンタクト」...

誰かが何が起こっているのか、私の問題を解決する方法を知っていますか?

4

0 に答える 0