как сделать HQL-запрос с помощью или операторов

1

У меня есть отношения ManyToMany между Utilisateur и Projet и я хочу извлечь всех пользователей, не существующих в объекте проекта, или пользователей, назначенных для завершенного проекта, тогда это мой запрос:

select u 
    from Utilisateur u 
    where 
        u.projets is empty or 
        u.projets.status like 'Completed'"

и это Utilisateur Entity:

@Entity
public class Utilisateur implements Serializable {

    @Column(name = "iduser", nullable = false)
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)  
    Integer iduser;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(
        schema = "public", 
        name = "join_membre_projet", 
        joinColumns = { 
            @JoinColumn(
                name = "iduser", 
                referencedColumnName = "iduser", 
                nullable = false, 
                updatable = false) }, 
        inverseJoinColumns = { 
            @JoinColumn(
                name = "idprojet", 
                referencedColumnName = "idprojet", 
                nullable = false, updatable = false) })
    List<Projet> projets;

}

и это Projet Entity:

@Entity
public class Projet implements Serializable {

    @Column(name = "idprojet", nullable = false)
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)  
    Integer idprojet;

    String statut;

    @ManyToMany(
        mappedBy="projets", 
        fetch = FetchType.LAZY)
    List<Utilisateur> utilisateurs;
}

этот мой файл xhtml, содержащий метод, вызывающий запрос hql:

<p:dataTable id="checkboxDT" var="user" value="#{UtilisateurComponent.dispo()}" selection="#{ProjetComponent.projet.utilisateurs}" rowKey="#{user.iduser}" style="margin-bottom:0">

        <f:facet name="header">
            Affectation des ressources
        </f:facet>
        <p:column selectionMode="multiple" style="width:2%;text-align:center" />

        <p:column headerText="Id">
            <h:outputText value="#{user.iduser}" />
        </p:column>
         <p:column headerText="Nom">
            <h:outputText value="#{user.nomuser}" />
        </p:column>

            </p:dataTable>
            <h:panelGroup>
                <p:commandButton image="save" ajax="false"
                    style="margin-right:20px;" value="#{projetmsgs['navigation.save']}"
                    action="#{ProjetComponent.saveProjetUtilisateurs1(ProjetComponent.projet, ProjetComponent.projet.utilisateurs)}" />
        </h:panelGroup>

это ошибка трассировки стека:

 org.hibernate.QueryException: illegal attempt to dereference collection [utilisateu0_.iduser.projets] with element property reference [statut] [select u from com.gestion.projet.domain.Utilisateur u where u.projets  is empty or  u.projets.statut like 'Completed' ]

сгенерированный SQL-запрос с левым соединением:

 select * 
 from public.utilisateur utilisateu0_ 
      left outer join projet_utilisateur projets1_ on utilisateu0_.iduser=projets1_.utilisateurs_iduser 
      left outer join public.projet projet2_ on projets1_.projets_idprojet=projet2_.idprojet 
 where  
      not (exists (select projet2_.idprojet from public.projet projet2_)) or 
      projet2_.statut like 'Completed'
  • 0
    Запрос кажется правильным, пожалуйста, добавьте sql, сгенерированный hibernate, и реальную проблему.
  • 0
    я отредактировал свой пост, теперь вы можете увидеть трассировку стека и метод, который вызывает этот запрос
Показать ещё 4 комментария
Теги:
hibernate
jpa
java-ee

2 ответа

1
Лучший ответ

Попробуйте этот запрос:

select u 
from Utilisateur u 
left join u.projets p
where 
    p is null or 
    p.statut like 'Completed'"

См. Это, вам нужно присоединиться, прежде чем использовать атрибут. Разница между join и left join состоит в том, что left join получает все Utilisateur, включая те, у которых нет проекта.

Изменить is empty для is null, теперь в моем локальном тестировании хорошо работает !, см. Этот пример для полного примера !.

  • 0
    проблема в том, что он не показывает пользователей, не существующих в объекте проекта
  • 0
    Смотрите редактирование, переходите от join к left join
Показать ещё 2 комментария
2

Проверьте наличие опечатки в своем классе "Projet" - это говорит о статуте, а не о статусе...

  • 0
    спасибо за ответ и извините за опечатку, но у меня есть другая ошибка

Ещё вопросы

Сообщество Overcoder
Наверх
Меню