2012-03-26 84 views
3

我有一个树形对象,由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,但我不认为这是可能的在休眠。

回答

2

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

此外,为了防止开发人员改变使用反射custom_order属性,使custom_order通过设置insertupdatefalse为只读:

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

目前,Order在标准API只能处理映射属性。如果您不想将custom_order属性映射到MyClass,那么如果Criteria API中的Order支持通过本机SQL进行排序,则可以实现您的目的。有这种支持(HHH-1356HHH-2381HHH-3315)一些请求,但他们现在仍然没有得到解决。

幸运的是,有人就已经extended the Order class in order to support ordering by native SQL。所以,如果你没有为MyClass地图custom_order栏,你可以简单地使用这个扩展Order类:

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

好极了,我需要的到底是什么?! – mindas 2012-04-04 09:56:46

0

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

+0

你介意解释我怎么能定义一个属性这样一个列表索引 – mindas 2012-04-02 14:31:00