2

我正在使用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_Dossieridselect count(*) from dossier_detail udd where udd.dossier_id = id) = 0

引起:java.sql.SQLSyntaxErrorException:ORA-00918:列定义不明确

我怎么解决这个问题?

4

1 回答 1

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
        )
)
于 2017-02-13T10:00:04.237 回答