我有一个树状对象,由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))