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 コンタクト」...
誰かが何が起こっているのか、私の問題を解決する方法を知っていますか?