Java 如何使用或运算符进行HQL查询
我在Java 如何使用或运算符进行HQL查询,java,sql,hibernate,jakarta-ee,jpa,Java,Sql,Hibernate,Jakarta Ee,Jpa,我在usilizateur和Projet之间有很多关系,我想提取项目实体中不存在的所有用户或分配给已完成项目的用户 那么这就是我的疑问: select u from Utilisateur u where u.projets is empty or u.projets.status like 'Completed'" 这就是利用我们的实体: @Entity public class Utilisateur implements Seria
usilizateur
和Projet
之间有很多关系,我想提取项目实体中不存在的所有用户或分配给已完成项目的用户
那么这就是我的疑问:
select u
from Utilisateur u
where
u.projets is empty or
u.projets.status like 'Completed'"
这就是利用我们的实体:
@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;
}
@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>
使用左联接生成的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'
检查“Projet”类中是否有输入错误-它显示的是statut,而不是status…尝试以下查询:
select u
from Utilisateur u
left join u.projets p
where
p is null or
p.statut like 'Completed'"
请参见,您需要在使用属性之前加入。join
和left join
之间的区别在于left join
get allusilizateur
,包括那些没有项目的项目
更改为空
因为为空
,现在,在我的本地测试中运行良好!,有关完整示例,请参见 查询似乎有效,请添加由hibernate生成的sql和真正的问题。我编辑了我的帖子,现在您可以看到堆栈跟踪和调用此查询的方法错误说明您的实体项目
没有状态
属性,请添加项目
实体的相关部分。您的财产是状态
而不是状态
,将您的HQL更改为u.projets.statit like'Completed'
@AVlope:检查新错误谢谢回复,很抱歉拼写错误,但我有另一个错误现在的问题是它没有显示项目实体中不存在的用户相同的问题查看编辑我将显示生成的sql查询生成的子选择错误,是一个全选表单项目,您的实体定义有问题,我正在搜索!。
select u
from Utilisateur u
left join u.projets p
where
p is null or
p.statut like 'Completed'"