【问题标题】:Hibernate - Set filtered on column in parent and child tablesHibernate - 在父表和子表中的列上设置过滤
【发布时间】:2012-09-23 20:03:49
【问题描述】:

我有一个与NodeDatas 关联的Node。这些NodeDatas 有修订,Node 有一个列latestRevision 告诉它哪个是最后一个修订。

我正在尝试找出我需要的映射,以便通过Node 中的latestRevision 过滤下面的集合。

 <class name="Node" table="RatNodes">
    <id name="id">
        <generator class="native"/>
    </id>
    <set fetch="join" name="nodeDatas" table="RatNodeData" inverse="true" access="field" cascade="all-delete-orphan" order-by="dataOrder asc">
        <key column="nodeID" on-delete="cascade"/>
        <one-to-many class="NodeData"/>
        <filter name="revisionFilter" condition="revision = latestRevision"/>
    </set>
    <property name="questionNumber" access="field"/>
    <property name="type" access="field"/>
</class>
<class name="NodeData" table="RatNodeData">
    <composite-id>
        <key-property name="nodeID" access="field"/>
        <key-property name="key" access="field" column="dataKey"/>
        <key-property name="order" access="field" column="dataOrder"/>
        <key-property name="revision" access="field"/>
    </composite-id>
    <property name="value" access="field" type="EncodedStringUserType" column="dataValue"/>
</class>

我启用过滤器时这个映射的结果是错误的:

Caused by: com.jnetdirect.jsql.JSQLException: Invalid column name 'latestRevision'.

它吐出的查询是:

select nodedatas0_.nodeID as nodeID1_, nodedatas0_.dataKey as dataKey1_, nodedatas0_.dataOrder as dataOrder1_, nodedatas0_.revision as revision1_, nodedatas0_.nodeID as nodeID46_0_, nodedatas0_.dataKey as dataKey46_0_, nodedatas0_.dataOrder as dataOrder46_0_, nodedatas0_.revision as revision46_0_, nodedatas0_.dataValue as dataValue46_0_ from RatNodeData nodedatas0_ where  nodedatas0_.revision = nodedatas0_.latestRevision and nodedatas0_.nodeID=? order by nodedatas0_.dataOrder asc

我可以说这是错误的,因为它正在 NodeData 上寻找 latestRevision,但我不确定如何告诉它改为在 Node 上寻找。这在休眠中可能吗?如果我只是使用 SQL,这似乎是一个非常简单的查询。

【问题讨论】:

    标签: java sql hibernate jsf hibernate-mapping


    【解决方案1】:

    最终这样做而不是尝试在映射文件中这样做:

    List datas = session.createCriteria(NodeData.class)
                    .add(Restrictions.eq("nodeID", this.id))
                    .add(Restrictions.eq("revision", this.latestRevision))
                    .list();
    

    我不确定这是否是正确的做法。也很想了解映射文件解决方案。

    【讨论】:

    • 您好 Philippe,您还在使用此解决方案吗?恕我直言,看起来不错,但我也想听听关于映射的事!你可以看看stackoverflow.com/questions/24283199/…
    • 我已经有一段时间没有从事那个项目了,但据我所知,它仍在以这种方式工作。
    • 谢谢菲利普!如果我能做到,我会告诉你的。干杯
    【解决方案2】:

    您尚未将任何过滤器或“latestRevision”定义为过滤器参数。所以它不会知道实体的实际含义。 尝试使用以下。

    如需进一步帮助,请查看link

    【讨论】:

      猜你喜欢
      • 2018-10-10
      • 2022-11-26
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多