2017-03-02 2 views
0

In meinem Schema habe ich eine Tabellen Cutter, Property und PropertyValue. Teilspalten:Sortieren Hibernate @ OneToMany über verwandte Eigenschaft?

Cutter 
    id 

Property 
    id 
    name 
    desc 

PropertyValue 
    property_id 
    cutter_id 
    value 

Ich möchte wie etwas tun:

@Entity 
@Table(name = "Cutter") 
public 
class 
Cutter implements Serializable 
{ 
    @OrderBy("property.name asc") 
    @OneToMany(mappedBy = "cutter") protected SortedSet<PropertyValue>  properties; 
} 

Aber das führt zu der offensichtlichen Ausnahme: Unknown column 'properties0_.property.name' in 'order clause'.

Ich machte PropertyValue implementieren Comparable, aber das scheint nicht genug zu sein. Hibernate wollte die @OrderBy Annotation trotzdem.

+0

ist 'name' eine Eigenschaft von' PropertyValue'? Wenn ja, benutze einfach '@OrderBy (" name asc ")' – jorgegm

+0

@jorgegm, wenn das nicht klar war, aber nein, 'name' ist eine Eigenschaft von' Property', weshalb das nicht einfach ist. – Rick

+0

Ops, ich habe es nicht bemerkt. Gemäß dem Javadoc von OrderBy ist es nicht möglich: "Der Name der Eigenschaft oder des Felds muss dem einer persistenten Eigenschaft oder eines Feldes der zugehörigen Klasse oder eingebetteten Klasse entsprechen." Eine mögliche Lösung besteht darin, eine 'List ' zu verwenden und eine '@ PostLoad'-Methode zu implementieren, um' SortedSet' zu erstellen. – jorgegm

Antwort

1

Sie sollten Comparable verwenden und die -Eigenschaft mit @Sort(type = SortType.NATURAL) annotieren können, damit Hibernate den Speicher sortieren kann.

+0

Ich fand '@ org.hibernate.annotations.SortNatural', was mir das Verhalten zu geben scheint, das ich möchte, obwohl ich nicht weiß, welche Art von Leistungseinfluss das haben wird. Glücklicherweise gibt es nur eine Handvoll Eigenschaften pro Cutter. Vielen Dank! – Rick

+1

Wenn Sie jemals eine Anzahl von Cutter-Instanzen abfragen, von denen Sie möglicherweise auf diese Eigenschaftswerte zugreifen müssen, können Sie auch '@ BatchSize' verwenden, um den N + 1-Auswahl-Overhead zu minimieren. Offensichtlich wäre es ideal, wenn die Datenbank die Sortierung durchführt, aber behalte sie und das Profil genau im Auge, um sicher zu gehen. – Naros

Verwandte Themen