2012-03-26 12 views
3

Ich habe ein Baum-ähnliches Objekt, verwaltet von Hibernate. Das Objekt hat eine Liste von Kindern und jedes Kind hat seine eigene custom_order innerhalb eines übergeordneten:Hibernate-Kriterien für nicht zugeordnete Eigenschaft

<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> 

Die custom_order existiert hier, um die Reihenfolge der Kinder innerhalb eines Elternteils zu halten, hat aber keine Vertretung in der Java POJO und ist direkt von Hibernate verwaltet. Das einzige, was ich tun muss, ist eine Liste zu liefern und custom_order wird automatisch generiert. So weit, ist es gut.

Was ich erreichen möchte, ist die Fähigkeit, Criteria API zu verwenden und durch zu bestellen. Im Moment kann ich einfach nichts tun, wie

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

weil es keine solche POJO Eigenschaft ist.

Frage: Gibt es eine Möglichkeit, die Kriterien-API für dieses Szenario zu verwenden, ohne POJO-Getter/Setter hinzuzufügen?

EDIT: Ich habe nichts dagegen, custom_order Attribut zu MyClass Attribut hinzuzufügen, aber ich glaube nicht, dass dies in Hibernate möglich ist.

Antwort

2

Es ist möglich, das custom_order-Attribut zu MyClass zuzuordnen, ohne Getter oder Setter für dieses Attribut hinzuzufügen. Konfigurieren Sie einfach das Attribut custom_order für den Zugriff nach Feld.

auch zu verhindern, dass Entwickler von Ändern der custom_order Eigenschaft mit Reflexion, machen custom_order schreibgeschützt werden durch insert und update-false Einstellung:

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

Derzeit Order in Criteria API kann nur zugeordneten Eigenschaften verarbeiten . Wenn Sie das Attribut custom_order nicht MyClass zuordnen möchten, können Sie Ihren Zweck erfüllen, wenn Order in der Kriterien-API die Sortierung nach nativem SQL unterstützt. Es gibt einige Anfragen für diese Unterstützung (HHH-1356, HHH-2381, HHH-3315) aber sie sind jetzt noch ungelöst.

Glücklicherweise jemand schon extended the Order class in order to support ordering by native SQL hatte. Also, wenn Sie nicht custom_order Spalte ordnen für MyClass, können Sie einfach diese verlängert Auftragsklasse:

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

Fantastisch, genau das, was ich brauchte! – mindas

0

Sie können die nicht zugeordnete Eigenschaft nicht in die Kriterienabfrage aufnehmen. Wenn Sie criteria.list() oder criteria.uniqueResult() ausführen, wird Hibernate die Eigenschaft nu-mapped property ausschließen.

+0

Haben Sie etwas dagegen zu erklären, wie könnte ich eine Eigenschaft für eine solche Liste Index definieren? – mindas