"where" 限制不适用于带有 join 子句的 hql 查询

"where" restrictions not working on hql query with join clause

首先说明我对数据库很烂,所以请不要对我的代码有任何恶意:P

我在使用连接和限制查询休眠时遇到问题。我有一长串 Assignments,其中一些有一个 Asr 对象。

queryString.append("select new commons.bo.assignment.AssignmentAssociateExtract("
    + " assignment.id, assignment.contract.assignmentStatus,"
    + " assignment.contract.beginDate, assignment.contract.endDate,"
    + " assignment.contract.contractType, assignment.organizationalData.homeCountryKey,"
    + " assignment.organizationalData.hostCountryKey," 
    + " assignment.organizationalData.homeOrgUnitKey,"
    + " assignment.associate.globalIdAssociate,"
    + " assignment.associate.localIdHome,"
    + " assignment.associate.firstName,"
    + " assignment.associate.lastName)"
    + " from Assignment assignment left join assignment.asr asr"
    + " where assignment.contract.assignmentStatus.code = 5"
    + " and asr.homeAsrElegibility is not 'X'"
    + " or asr.homeAsrElegibility is null"
);

我正在逐步创建此查询。在我创建它之前没有连接子句 left join assignment.asr asr 并且它运行良好但当然它没有显示没有 Asr 对象的 Assignments 。添加 join 子句后,现在它显示每个 Assignment(当拥有 assignmentStatus = 5 的人只有 4.000 时,有 10.000 条记录)和

之类的限制
where assignment.contract.assignmentStatus.code = 5

不再反映在结果中。

所以总结一下:我需要一个列表,其中包含所有 assignmentStatus = 5 和 asr.homeAsrElegibility != 'X' 的作业。但它还需要包括所有 assignmentStatus = 5 的分配,即使它们没有 Asr 对象。

有什么想法吗??谢谢!

括号有助于澄清情况。

queryString.append("select new commons.bo.assignment.AssignmentAssociateExtract("
    + " assignment.id, assignment.contract.assignmentStatus,"
    + " assignment.contract.beginDate, assignment.contract.endDate,"
    + " assignment.contract.contractType, assignment.organizationalData.homeCountryKey,"
    + " assignment.organizationalData.hostCountryKey," 
    + " assignment.organizationalData.homeOrgUnitKey,"
    + " assignment.associate.globalIdAssociate,"
    + " assignment.associate.localIdHome,"
    + " assignment.associate.firstName,"
    + " assignment.associate.lastName)"
    + " from Assignment assignment left join assignment.asr asr"
    + " where assignment.contract.assignmentStatus.code = 5"
    + " and ((asr.homeAsrElegibility is not null and asr.homeAsrElegibility is not 'X')"
    + " or (asr.homeAsrElegibility is null))"
);