JPA /Criterions — Select (или множественный выбор) при наборе атрибута

#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>)