Frage

Angenommen, ich habe Klassen Benutzer und Benutzergruppe. Es gibt eine optionale 1-Viele Gruppe für die Benutzervereinigung, und der Verband wird von beiden Seiten (der Benutzergruppe Seite über eine Eigenschaft namens "Mitglieder" zugeordnet, die eine Hashset ist, die Benutzerseite über die Eigenschaft "Gruppe").

Wie kann ich anhand der Kriterien -API für alle Gruppen, sortiert nach Gruppenmitgliedern, abfragen?

(Bearbeiten) Ich hätte darauf hinweisen sollen, als ich dies fragte, dass Pagination in der SQL durchgeführt wird, sodass die Bestellung nach Möglichkeit auch in der SQL durchgeführt werden sollte.

War es hilfreich?

Lösung

Eine andere Option wäre die Verwendung der @formula -Annotation, die im Grunde genommen das Erstellen eines verschachtelten Auswahl entspricht, damit Sie Ihre Zählungen erhalten können.

Fügen Sie auf Ihrer DB -Objekt -Eigenschaft?

@Formula ("(" (table_name.id) aus der Tabelle, wo alles ...) ") public Long GetNewProperty {return NewProperty; }

Dann zielen Sie das Mitglied direkt an, um Ihre Zählwerte zu erfüllen ...

Hinweis: Beachten Sie, dass Sie bei der Angabe der SQL in der Formelanschlags die Feldnamen direkt angeben müssen, wenn Sie die aktuelle Objekttabelle (dies) beziehen, da der Hibernate sich damit befasst. Verwenden Sie also in Ihrer Where -Klausel nur ID oder was auch immer für sich, wenn Sie auf die aktuelle Objekttabelle Bezug genommen werden, von der ich vermute, dass sie die Benutzergruppe ist.

Ich musste einen Setter für meine neue Immobilie haben, damit der Winterschlaf arbeitet und den Compiler daran hindert, sich zu beschweren.

Es mag andere clevere Möglichkeiten geben, @formula zu verwenden, aber ich bin ziemlich neu in diesem und es scheint keine sehr viel Dokumentation zu diesem Thema zu geben ...

Wenn Sie noch nie verschachtelte Auswahl verwendet haben, ist es für Sie möglicherweise eine Idee, zuerst in SQL nachzubilden - das hat mir geholfen.

Hoffe das hilft

Andere Tipps

Es ist standardmäßig mit Citeria -API nicht möglich, aber Sie können org.hibernate.criterion.order -Klasse erweitern. In diesem Artikel geht es darum, wie diese Klasse erweitert wird: http://blog.tremend.ro/2008/06/10/how-to-order-by-custom-sql-formulaexpression-when-using-hibernate-criteria-api

Meine Sollution ist:

public class SizeOrder extends Order {

    protected String propertyName;
    protected boolean ascending;

    protected SizeOrder(String propertyName, boolean ascending) {
        super(propertyName, ascending);
        this.propertyName = propertyName;
        this.ascending = ascending;
    }

    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
        String role = criteriaQuery.getEntityName(criteria, propertyName) + '.' + criteriaQuery.getPropertyName(propertyName);
        QueryableCollection cp = (QueryableCollection) criteriaQuery.getFactory().getCollectionPersister(role);

        String[] fk = cp.getKeyColumnNames();
        String[] pk = ((Loadable) cp.getOwnerEntityPersister())
                .getIdentifierColumnNames();
        return " (select count(*) from " + cp.getTableName() + " where "
                + new ConditionFragment()
                        .setTableAlias(
                                criteriaQuery.getSQLAlias(criteria, propertyName)
                        ).setCondition(pk, fk)
                    .toFragmentString() + ") "
                + (ascending ? "asc" : "desc");
    }

    public static SizeOrder asc(String propertyName) {
        return new SizeOrder(propertyName, true);
    }
    public static SizeOrder desc(String propertyName) {
        return new SizeOrder(propertyName, false);
    }
}

Die TOSQLString -Methode basiert auf org.hiberNate.criterion.sizeexpressionsklasse. (Quelle: http://javasourcecode.org/html/open-source/hibernate/hibernate-3.6.0.final/org/hibernate/criterion/sizeexpression.java.html)

Beispiel Verwendung:

hibernateSession.createCriteria(UserGroup.class).addOrder( SizeOrder.asc("members") ).list();

Auf diese Weise werden Benutzergruppen aufgeführt, die von der Größe der aufsteigender Mitglieder bestellt wurden, wobei "Mitglieder" die Benutzersammlung in der Benutzergruppenentität sind.

Sie könnten dies wahrscheinlich tun, indem Sie eine "abgeleitete Eigenschaft" auf Ihrem Unternehmen definieren, die eine schreibgeschützte Eigenschaft wäre, die die Größe der Sammlung in dieser Entität zurückgibt. Der einfachste Weg, eine abgeleitete Eigenschaft zu definieren, ist Hier dokumentiert:

Aktualisieren, einfügen (optional - Standardeinstellungen zu True): Gibt an, dass die zugeordneten Spalten in SQL -Update und/oder Anweisungen einfügen sollten. Durch das Einstellen von FALSE ermöglicht eine reine "abgeleitete" Eigenschaft, deren Wert aus einer anderen Eigenschaft initialisiert wird, die auf dieselben Spalten (n) oder durch einen Auslöser oder eine andere Anwendung abgebildet wird.

Sobald die Eigenschaft definiert ist, sollten Sie den Eigenschaftsnamen als Auftragsklausel in der Kriterien -API genau wie jede andere Eigenschaft verwenden können. Ich habe das aber nicht selbst ausprobiert.

Wenn es funktioniert, wird es wahrscheinlich als In-Memory-Sortierung erfolgen, da es nicht in der Lage sein wird, es SQL zuzuordnen. Wenn dies ein Problem ist, dokumentiert derselbe Link über dem Umsetzung einer abgeleiteten Eigenschaft mit einem benutzerdefinierten SQL -Fragment:

Ein leistungsstarkes Merkmal sind abgeleitete Eigenschaften. Diese Eigenschaften sind per Definition schreibgeschützt. Der Eigenschaftswert wird zur Ladezeit berechnet. Sie deklarieren die Berechnung als SQL -Ausdruck. Dies führt dann zu einer SELECT -Klausel -Unterabfrage in der SQL -Abfrage, in der eine Instanz geladen wird:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top