Hibernate: zweite Tabelle für Sortierung heranziehen - wie?

Kryptaesthesie

Erfahrenes Mitglied
Guten Abend,

ich bin verwirrt und komme einfach nicht dahinter.
Ich habe eine DAO-Klasse mit folgender Get-Methode:

Code:
	public List<UserContact> get(User user) throws DAOException {
		try {
			int userID = user.getId();
			begin();
			Query q = getSession().createQuery("from UserContact where userID = :userid");
			q.setInteger("userid", userID);
			List<UserContact> ucList = (List<UserContact>) q.list();
			commit();
			return ucList;
		} catch(HibernateException he) {
			rollback();
			String msg = "Die Kontaktdatensätze von #" + user.getId() + " konnte(n) nicht abgerufen werden.";
			logger.error(msg, he);
			throw new DAOException(msg, he);
		}
	}


Ein Attribut von UserContact ist typeID und vom Typ int. TypeID ist von einer anderen Tabelle der PK und ich würde gerne nach einer Spalte dieser TypeID-Tabelle sortieren. Noch schöner wäre es ja, wenn ich statt des typeID-Attributs direkt ein Attribut vom Typ ContactType. Aber das ist noch eine andere Sache :)

Hier noch die beiden Mapping-Dateien für die zwei Klassen:

Code:
<hibernate-mapping>
     <class name="com.giglocator.obj.db.UserContact" table="USERCONTACT">
        <id name="id" column="ID">
            <generator class="native"/>
        </id>
       	<property name="userID"/>
       	<property name="typeID"/>
	<property name="value" column="entryvalue"/>
	<property name="since"/>
     </class>
</hibernate-mapping>

Code:
<hibernate-mapping>
     <class name="com.giglocator.obj.db.ContactType" table="CONTACT_TYPE">
        <id name="id" column="CONTACT_ID">
            <generator class="native"/>
        </id>
        <property name="accessory"/>
        <property name="created"/>
        <property name="label" not-null="true"/>
        <property name="sequence" not-null="true"/>
    </class>
</hibernate-mapping>

Nach dem Attribut sequence möchte ich sortieren! :)


Ich danke euch schon mal für eure Hilfe!
Gruß
Gerrit
 
Verwende doch zum Abspeichern deiner Objekte einfach eine Hashtable oder eine TreeMap mit dem Attribut sequence als Schlüssel.
 
Guten Morgen,
Verwende doch zum Abspeichern deiner Objekte einfach eine Hashtable oder eine TreeMap mit dem Attribut sequence als Schlüssel.
ich habe in meinem Beispiel aber eine eins-zu-eins-Beziehung. UserContact hat also nur ein ContactType und kein Set. Aber wenn ich alle UserContact abrufe, dann soll ContactType zur Sortierung herangezogen werden?!

Oder wie meinst du das?
Gruß
Gerrit
 
Vergiss am besten meine vorherige Idee.
Für mich stellt sich die Sache so dar (korrigiere mich bitte, wenn ich falsch liege). Du hast zwei Tabellen UserContact und ContactType. Wahrscheinlich hast du keine 1:1-Relation, sondern eine n:1-Relation, d.h. ein ContactType kann von mehreren Usern verwendet werden. Du musst demnach eine Query über zwei Tabellen machen, also einen Join, dem du eine order-by-Klausel beifügst.
Wenn du wirklich eine 1:1-Relation hast, dann solltest du die Daten von ContactType einfach in UserContact übernehmen.
Vielleicht findest du aber auch in diesem Hibernate Tutorial eine passende Anregung.
 
Ich habe es nun hinbekommen :)

In dem Mapping vom User nutze ich nun sort="comparatorClass":
Code:
        <set name="contact" table="USER_CONTACT" sort="comparatorClass">
        	<key column="userID"/>
			<one-to-many class="com.giglocator.obj.db.UserContact"/>
        </set>

In der Klasse UserContact habe ich dann folgende Methode implementiert:
Code:
	public int compareTo(UserContact that) {
		final int BEFORE = -1;
		final int AFTER = 1;
		// GLEICH (int = 0) darf nicht zurückgegeben werden, da dann in der Ergebnisliste einer der beiden Einträge überschrieben wird. Bietet sich also für eine Sortierung nicht an!
		
		if(that == null)
			return BEFORE;
		
		int thisSequence = this.contactType.getSequence();
		int thatSequence = that.contactType.getSequence();
		
		if(thisSequence < thatSequence)
			return BEFORE;
		else
			return AFTER;
	}
So hole ich mir den Vergleichswert aus dem Attribut sequence.
Die Klasse UserContact muss noch das Interface java.lang.Comparable<UserContact> implementieren!

Danke für deine Hilfe, Vereth!
Und du hattest Recht, es handelt sich nicht um eine 1-1 Beziehung, sondern um eine many-to-one! :p

Gruß
Gerrit
 
Zurück