2016-06-28 55 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」從不工作時,有一對一的映射。 –