2017-02-02 9 views
0

Прежде всего уточнить, что я очень плохо с базами данных, поэтому, пожалуйста, не иметь в виду, с моим кодом: P«где» ограничения не работает на HQL запрос с присоединиться пункт

У меня есть проблема с запросом в спящем режиме с использованием соединений и ограничений. У меня есть огромный список 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, и он работал хорошо, но, конечно, он не показывал Assignments, у которого не было объекта Asr. После того, как я добавил присоединиться пункт, теперь он показывает каждые одиночные Assignment (10000 записей, когда те, у кого есть assignmentStatus = 5 только 4,000) и ограничения, как

where assignment.contract.assignmentStatus.code = 5 

не отражаются в результате больше.

Итак, чтобы подвести итог: мне нужен список со всеми назначениями с присваиваниемStatus = 5 и asr.homeAsrElegibility! = 'X'. Но он должен также включать все назначения с присваиваниемStatus = 5, даже если у них нет объекта Asr.

Любые идеи? Благодаря!

ответ

1

Скорлупа помогает прояснить ситуацию.

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))" 
); 
+0

Вы правы! Я пытался удалить предложение 'is not 'X'' и просто оставил последний и, конечно же, удалил ключевое слово' или', и он работает. Благодаря! – Carloshf

+0

Добро пожаловать. –