【问题标题】:what's wrong with this HQL query?这个 HQL 查询有什么问题?
【发布时间】:2014-07-18 10:33:02
【问题描述】:

我在UtilisateurProjet 之间有ManyToMany 关系,我想提取项目实体中不存在的所有用户以及分配给“Terminé”(statut 值:Projet 属性)项目的用户这是我的查询:

select u from Utilisateur u left join u.projets p where p is null and  p.statut like 'Terminé'

生成的 sql 查询:

Hibernate: select utilisateu0_.iduser as iduser5_, utilisateu0_.datederniereconnexion as datedern2_5_, utilisateu0_.email as email5_, utilisateu0_.grade as grade5_, utilisateu0_.login as login5_, utilisateu0_.mdp as mdp5_, utilisateu0_.nomuser as nomuser5_, utilisateu0_.tel as tel5_ 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 (projet2_.idprojet is null) and 
(projet2_.statut like 'Terminé')

这是我的Projet 实体:

@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;
}

这是Utilisateur 实体:

@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;

}

问题是它没有显示任何用户

【问题讨论】:

  • 您选择的是表别名,而不是选择语句中的任何列。在您的选择语句中,它应该类似于 U.ColumnName 而不仅仅是 U
  • left join u.projets p 看起来也不正确,如果是,则您缺少 ON 语句。您能否向我们展示您的表格结构,以便我们更好地帮助您?
  • 我根本看不出该查询是如何工作的。 Hibernate 查询与您发布的查询不同。但我看到的最大问题是你是outer join。您正在加入 idprojet,但随后检查它是否为空,然后检查同一个表中的另一个字段是否等于某个值...
  • 抱歉,我对休眠帮助不大,但是您的 HQL 代码有问题。您确定要检查OUTER JOINnull 吗?尝试删除它们,因为它们否定 `p.statut like 'Terminé'`。
  • 我想提取没有任何项目的用户以及拥有该项目状态为“Terminé”的项目的用户

标签: java sql hibernate jakarta-ee jpa


【解决方案1】:

从您的 cmets 中:我想提取没有任何项目的用户以及拥有该项目状态为“Terminé”的项目的用户

我认为您想在 WHERE 条件中使用 OR 而不是 AND

select u 
from Utilisateur u 
    left join u.projets p 
where p is null 
    or p.statut = 'Terminé'

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 2011-10-13
    • 2010-09-07
    • 2010-10-04
    • 2011-01-15
    相关资源
    最近更新 更多