JPA / Критерии - Выберите (или множественный выбор) на SetAttribute - PullRequest
2 голосов
/ 27 мая 2011

Я очень расстроен, пытаясь использовать критерии 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». * ОТ контакта "...

Кто-нибудь имеет представление о том, что происходит и как решить мою проблему?

...