#hibernate #jpa #criteria #setattribute
#переход в спящий режим #jpa #критерии #setattribute
Вопрос:
Я действительно расстраиваюсь, пытаясь использовать критерии 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» — это набор (c.f. metamodel: «setAttribute»), я ожидал получить список>, но на самом деле я получаю список сглаженных списков… 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
Как вы можете видеть сразу после первой комы: «. как col_1_0_», что не является допустимым SQL-запросом..
Итак, я действительно не знаю, как делать то, что я хочу.. В моем объектном контакте все поля загружены, потому что, когда я загружаю контакт, я закрываю транзакцию, и, таким образом, объект отсоединяется и не позволяет мне загружать данные с задержкой. Но у меня есть «экран поиска», где я отображаю подмножество всех полей контактов.. Итак, чтобы значительно увеличить перфорацию, я был готов сделать конкретный запрос для этой части и загрузить только то, что мне нужно, вместо «ВЫБРАТЬ * ИЗ контакта»…
Есть ли у кого-нибудь представление о том, что происходит и как решить мою проблему?
Комментарии:
1. Звучит как большая проблема. Является ли использование JPA единственным вариантом для вас?
2. Цель запроса мне не ясна. Вы хотите получить группы данного контакта? Это то, что вы пытаетесь сделать? В противном случае, не могли бы вы, пожалуйста, указать, какова цель вашего запроса?
3. @Lukas Eder: Да, JPA является обязательным требованием в моем проекте.. @Edalorzo: Ну, не совсем, я хочу получить группы всех контактов, а также пару других полей, таких как идентификатор контактов, имя и фамилия, например. Итак, в основном для каждого контакта я хочу его идентификатор, имя, фамилию и группы (где groups — это набор).. Таким образом, я ожидаю в результате список <Object[]>, где Object[0] = идентификатор (целое число), Object[1] = имя пользователя (строка), Object[2] = имя пользователя (строка) и Object[3] = группы (набор<TypeGroupe>)