java – 非映射属性的Hibernate标准

我有一个树状对象,由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中是可能的.

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

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

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

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

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

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