非映射属性的Hibernate标准

时间:2012-03-26 12:13:22

标签: java hibernate orm criteria-api

我有一个树状对象,由Hibernate管理。该对象有一个子项列表,每个子项在父项中都有自己的custom_order

<hibernate-mapping>
  <class name="MyClass" .../>
  <property .../>
  <property .../>
  <list name="children" cascade="save-update" inverse="false">
    <key column="parent_id"/>
    <index column="custom_order"/>
    <one-to-many class="MyClass"/>
  </list>
</hibernate-mapping>

custom_order存在于此处,以便维护父级中的子级顺序,但在Java POJO中没有任何表示形式,并且由Hibernate直接管理。我唯一要做的就是提供一个列表,custom_order将自动生成。到目前为止一切都很好。

我想要实现的是能够使用Criteria API并按custom_order排序。目前我根本无法做任何事情,比如

criteria.addOrder(Order.asc("custom_order"));

因为没有这样的POJO属性。

问题:有没有办法在不添加POJO getter / setter的情况下为此方案使用Criteria API?

编辑:我不介意向custom_order添加相关的MyClass属性,但我认为这在Hibernate中不可行。

3 个答案:

答案 0 :(得分:2)

可以将custom_order属性映射到MyClass,而无需为此属性添加getter或setter。只需将custom_order属性配置为按字段访问即可。

另外,为了防止开发人员使用反射更改custom_order属性,请将custom_orderinsert设置为update,使false变为只读:

<property name="customerOrder" column="custom_order" access="field" insert="false" update="false"/>

目前,Criteria API中的Order只能处理映射的属性。如果您不想将custom_order属性映射到MyClass,那么如果Criteria API中的Order支持按本机SQL排序,则可以实现您的目的。有一些请求获得此支持(HHH-1356HHH-2381HHH-3315),但现在仍未解决。

幸运的是,有人已经extended the Order class in order to support ordering by native SQL。因此,如果您没有为custom_order映射MyClass列,则只需使用此扩展订单类:

addOrder(new NativeSQLOrder("custom_order" ,true))

答案 1 :(得分:0)

您不能在条件查询中包含未映射的属性。当你执行criteria.list()或criteria.uniqueResult()时,Hibernate将抛出nu映射的属性异常。

答案 2 :(得分:0)

您可以在运行时向hibernate映射添加属性,然后在Criteria中使用它。 There's good article on infoq on how to add add custom fields dynamically.