Я очень расстроен, пытаясь использовать критерии 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», где «groupes» - это набор (см. Метамодель: «SetAttribute»), я ожидал получить List>, но на самом деле получаю плоский список Список ... Hibernate фактически генерирует один запрос SQL, когда я ожидал получить запрос для каждого элемента / набора моего Списка ....
Но первоначально я хотел сделать запрос с множественным выбором, чтобы получить пару полей, одно из которых находится в моем наборе. Если я попытаюсь сделать множественный выбор с моими "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». * ОТ контакта "...
Кто-нибудь имеет представление о том, что происходит и как решить мою проблему?