2016-06-28 71 views
1

我有一个名为Project的实体。HQL:帮助执行加入

public class Project { 

@EmbeddedId 
private ProjectID id; 

@Column(name="updated_at") 
private Date updatedAt; 

@Column(name="sys_updated_at") 
private Date sysUpdatedAt; 

@OneToOne(optional=true, mappedBy="project", fetch=FetchType.EAGER) 
private SysProject sysProject; 
} 

正如你可以看到它与“SysProject”一对一关系

public class SysProject extends BaseSysEntity implements Serializable { 

@OneToOne(optional=true, fetch= FetchType.LAZY) 
@JoinColumns({ 
    @JoinColumn(name="sysClientId", referencedColumnName="sysClientId"), 
    @JoinColumn(name="pProject", referencedColumnName="pProject") 
}) 
private Project project; 

@Column(name="sysupdate") 
private Date sysupdate; 


public Project getProject() { 
    return project; 
} 

public void setProject(Project project) { 
    this.project = project; 
} 
} 

现在我想写一个HQL查询满足两个条件。

1)SysProject为空的所有项目。

2)所有的项目,该项目具有SysProject但Project.updatedAt!= SysProject.sysupdate

我已经写了下面的查询,但它只返回满足点项目(2)

SELECT p FROM Project p WHERE (NOT EXISTS (SELECT s FROM p.sysProject s)) OR (p.sysProject.id IS NOT NULL AND p.sysProject.sysupdate != p.updatedAt) 

当我删除以下部分来自查询它满足点(1):

(p.sysProject.id IS NOT NULL和p.sysProject.sysupdate = p.updatedAt!)

回答

-1

试这:

String hql = "FROM Project WHERE sysProject IS NULL OR (sysProject.id IS NOT NULL AND sysProject.sysupdate != updatedAt)"; 
Query query = session.createQuery(hql); 
List<Project> projects = query.list(); 
+0

对于您的信息“从项目WHERE sysProject IS NULL”从不工作时,有一对一的映射。 –