我有一个树状对象,由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中不可行。
答案 0 :(得分:2)
可以将custom_order
属性映射到MyClass
,而无需为此属性添加getter或setter。只需将custom_order
属性配置为按字段访问即可。
另外,为了防止开发人员使用反射更改custom_order
属性,请将custom_order
和insert
设置为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-1356,HHH-2381,HHH-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.