Трудно что-то предложить, не видя ваших реальных отображений. Исходя из вашего объяснения и предполагая, что условие и conditionState отображаются как многие-к-одному, вы должны написать что-то вроде:
final DetachedCriteria criteriaObjective =
DetachedCriteria.forClass(Objective.class);
criteriaObjective
.createCriteria("condition", Criteria.LEFT_JOIN)
.createCriteria("conditionState", Criteria.LEFT_JOIN)
.add(Restrictions.eq("personid", "XXXX") );
criteriaObjective.add(Restrictions.eqProperty("toto_id", "YYYY") );
Обратите внимание, что вышеприведенное НЕ эквивалентно предоставленному вами SQL-запросу, потому что условие "personid" будет сгенерировано как часть предложения "WHERE". Насколько я знаю, невозможно выполнить левое соединение с условием, используя Criteria API - вместо этого вам может понадобиться использовать HQL, который предоставляет с ключевым словом для этой конкретной цели:
select o from objective as o
left join o.condition as c
left join c.conditionState as cs
with cs.person_id = 'XXXX'
and o.toto_id = 'YYYY'