2009-05-28 5 views
2

Ich habe eine Methode, die eine Liste von Entitäten (Class es) und macht einige Berechnungen. Um meine Bedürfnisse hier zu beschreiben, ist die einfachste Umriss des Verfahrens (Pseudocode):Hibernate bekommen Id von createCriteria() Ergebnis

public void do(List<Class<?> entities) { 
    for (Class<?> entity : entities) { 
     List<?> list = session.createCriteria(entity).list(); 
     for (Object o : list) { 
      System.out.println(o.getClass().getSimpleName() + " " + o.getId()); 
     } 
    } 
} 

Gibt es eine Möglichkeit, die ich zugreifen kann/erhalten die Id von o?

Antwort

0

Nur wenn Sie die Eigenschaft für alle Entitäten gleich benannt haben, können Sie mit Reflection den Getter für diese Eigenschaft aufrufen. Wenn sie alle Namen etwas anderes sind, dann würden Sie eine NoSuchMethodException

+0

Ich kann garantieren, dass es getId() -Methode hat und ich nehme das Risiko ein "Exception" zu bekommen. – nimcap

1

Nun bekommen, vielleicht wird es viele Kritiker bekommen, aber alle Ihre Entitätsklassen kann diese Schnittstelle implementieren:

public interface EntityWithId { 
    Integer getId(); 
    void setId(Integer id); 
} 

Wenn Ihr ids sind keine ganzen Zahlen Eventuell könnte die Schnittstelle sein: Wie auch immer

public interface EntityWithId<T> { 
    T getId(); 
    setId(T id); 
} 

public class Entity implements EntityWithId<String> { 
    private String id; 

    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 
    . 
    . 
    . 
} 

, ich sehe nicht, warum Sie die IDs aller Einheiten bekommen würde, es ist eine seltsame Lösung für eine seltsame Anforderung, hehe.

+0

Ich habe das fast schon vorher gemacht, aber ich habe aufgehört, alternative Wege zu finden, um das zu tun, was ich brauchte. Im Allgemeinen haben alle meine zugeordneten Entitätsklassen eine leere Markierungsschnittstelle implementiert. – araqnid