Hibernate не устанавливает псевдонимы и оракула "ORA-00918: столбец неоднозначно определен" ошибка

Я использую Hibernate 4.3.11.Final, и у меня есть эта модель и .hbm.xml файл:

Доменный класс

public class Dossier {
    private Long    id;
    private Power   power;
    private String  dossierNumber;

    // getter and stters
}

Файл отображения спящего режима

<hibernate-mapping>
    <class   name="com.rgh.Dossier"  table="DU_Dossier"  schema="DTR">
        <id name="id" type="long" >
            <column name="id"  />
            <generator class="sequence" >
                <param name="sequence">DTR.SEQ_Dossier</param>
            </generator>
        </id>

        <many-to-one    name="power"                column="power_Id"               entity-name="com.rgh.Power" not-null="true" />
        <property       name="dossierNumber"        column="dossier_Number"         type="string"       not-null="true" />

        <filter name="powerAuthorize" condition=" (exists (select t.id
                                                             from power_authorize t
                                                            where t.userid = :userId
                                                              and t.id = power_Id)

                                                    or (select count(*) from dossier_detail udd where udd.dossier_id = id) = 0
                                                   )"/>
    </class>
</hibernate-mapping>

и это метод, который я вызываю в хранилище:

@Autowired
private SessionFactory  sessionFactory;

public Session getSession() {
    try {
        return sessionFactory.getCurrentSession();
    }
    catch (Exception e) {
        return sessionFactory.openSession();
    }
}

@Override
public boolean changeStatus(Long dossierId, DossierStatus newStatus) {
    String hql =    " update " + Dossier.class.getName() + " e  " +
                    " set e.status = :newStatus                 " +
                    " where e.id = :dossierId                   ";

    Session session = getSession();
    Filter filter = session.enableFilter("powerAuthorize");
    filter.setParameter("userId", SecurityUtility.getAuthenticatedUser().getId());

    Query query = session.createQuery(hql);

    query.setParameter("newStatus", newStatus);
    query.setParameter("dossierId", dossierId);

    return query.executeUpdate() > 0;
}

и это сгенерированный sql запрос при вызове метода:

update DTR.DU_Dossier
   set status = ?
 where (exists
        (select t.id
           from power_authorize t
          where t.userid = ?
            and t.id = power_Id) and
        or (select count(*) from dossier_detail udd where udd.dossier_id = id) = 0)
   and ID = ?

и потому, что hql не устанавливает псевдоним для DU_Dossier в update DTR.DU_Dossier сегмент запроса, потому что я использовал id в select count(*) from dossier_detail udd where udd.dossier_id = id) = 0 сегмент запроса я получаю эту ошибку ниже:

Вызвано: java.sql.SQLSyntaxErrorException: ORA-00918: столбец определен неоднозначно

Как я могу решить эту проблему?

1 ответ

Попробуйте определить выражение фильтра без псевдонимов... только прямые имена таблиц:

(exists (select power_authorize.id
              from power_authorize 
              where power_authorize.userid = :userId
                  and power_authorize.id = du_dossier.power_Id)
                  or (select count(*) from dossier_detail 
                        where dossier_detail.dossier_id = du_dossier.id) = 0
        )
)
Другие вопросы по тегам