【问题标题】:Getting class cast exception when using hibernate使用休眠时获取类转换异常
【发布时间】:2014-05-17 07:01:39
【问题描述】:
hql = "select rm.* from remoteunit rm inner join mo m on rm.MOID = m.ID left join     
orgmomapping o on rm.MOID = o.MOID join organization org on org.ID = o.ORGANIZATIONID 
where m.DOMAINID = :id";

query = session.createSQLQuery(hql);

这个查询在使用查询时返回一个对象列表

remoteUnitList = (ArrayList<RemoteUnitDetails>)query.list();

但是当我尝试获取一个对象时

RemoteUnitDetails details = (RemoteUnitDetails)remoteUnitsList.get(i);

我得到类转换异常。

我正在使用 MySQL 数据库。在休眠中使用条件时,我无法匹配 orgmomapping 和 remoteunit 表。因为

orgmomapping -> id, organizationId, remoteUnitId
remoteunit   -> id

此远程单元 ID 可能存在也可能不存在于组织映射中。

请提出解决方案

谢谢

更新

RemoteUnitDetails.hbm.xml

<hibernate-mapping>
<class name="---.RemoteUnitDetails" table="remoteunit"
    lazy="false">
    <id name="id" column="ID">
        <generator class="increment" />
    </id>
    <many-to-one name="remoteUnit" column="MOID"
        class="---.RemoteUnit" not-null="true"></many-to-one>
    <property name="address" column="ADDRESS" />
    <property name="postalCode" column="POSTALCODE" />
    <property name="city" column="CITY" />
    <property name="region" column="REGION" />
    <property name="visible" column="VISIBLE" />
    <property name="lowPowerMode" column="LOWPOWERMODE" />
    <property name="wakeUpInterval" column="WAKEUPINTERVAL" />
    <property name="awakeInterval" column="AWAKEINTERVAL" />
    <property name="resetAtNextInterval" column="RESETATNEXTINTERVAL" />
    <property name="logInterval" column="LOGINTERVAL" />
    <property name="sendIntervalLogData" column="SENDINTERVALLOGDATA" />
    <property name="sendIntervalAttr1" column="SENDINTERVALATTR1" />
    <property name="sendIntervalAttr2" column="SENDINTERVALATTR2" />

  </class>
</hibernate-mapping>

RemoteUnit.hbm.xml

 <hibernate-mapping>
<class name="---.RemoteUnit" table="mo" lazy="false">
    <id name="id" column="ID">
        <generator class="increment" />
    </id>

    <property name="name" />
    <property name="aliasName" column="SCREENNAME" />
    <property name="description" column="DESCRIPTION" />
    <property name="isActive" column="ISLIVE" />

    <many-to-one name="domain" column="DOMAINID"
        class="---.Domain" not-null="true" />
    <!-- Foreign key -->
    <many-to-one name="moType" column="MOTYPEID"
        class="---.MoType" not-null="true" />
</class>
 </hibernate-mapping>

OrgMoMapping.hbm.xml

<hibernate-mapping>
<class name="---.OrgRemoteUnitMapping" table="orgmomapping"
    lazy="false">
    <id name="id" column="ID">
        <generator class="identity" />
    </id>

    <many-to-one name="organization" column="ORGANIZATIONID"
        class="---.Organization" not-null="true"></many-to-one>
    <many-to-one name="remoteUnit" column="MOID"
        class="---.RemoteUnit" not-null="true"></many-to-one>
</class>
</hibernate-mapping>

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

    我不建议您为此目的使用本机 SQL,因为您可以使用条件 API 轻松实现此目的。你可以做这样的事情。它可能会帮助你。

    ProjectionList projections = Projections.projectionList();
    projections.add(Projections.property("column.columnName"), "columnName");
    
    Criteria criteria = getCurrentSession().createCriteria(<<remoteunit>>.class, "remoteunit");
    criteria.createAlias("remoteunit.<<remoteunit_to_mo_joinfield>>", "mo", JoinType.INNER_JOIN);
    criteria.createAlias("mo.<<mo_to_orgmomapping_join_field>>", "orgmomapping", JoinType.LEFT_OUTER_JOIN);
    criteria.setProjection(projections);
    criteria.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
    List<Map<String,? extends Object>> list = criteria.list();
    

    【讨论】:

    • 如何加入 moorgmomapping 在其持久性类中没有映射我需要明确指定两者的列,如何做到这一点
    • 如果可能的话,你能提供你的 bean 类吗?
    • 我可以给你hbm映射吗?
    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 2016-08-05
    • 1970-01-01
    • 2014-06-09
    • 2014-04-13
    • 1970-01-01
    • 2023-03-08
    • 2012-11-29
    相关资源
    最近更新 更多