2 Stimmen

Grails-Projektionen group by und zählen

Im Folgenden sind meine beiden Klassen

class Users {
    String E-Mail-Adresse
    String Passwort
    //    String Dateiname
    String Vorname
    String Nachname
    Date DatumErstellt
    Date ZuletztAktualisiert
}

und

class SharedDocuments {
    Users Autor
    Users Empfänger
    Dokumente Datei
    static constraints = {

    }
}

Ich möchte eine Abfrage ähnlich wie diese durchführen, ich möchte im Wesentlichen eine Liste aller Benutzer zusammen mit der Anzahl der von ihnen verfassten Dokumente erhalten

SELECT autor_id, COUNT(SharedDocuments.id )FROM SharedDocuments 
  INNER JOIN users ON autor_id = users.id
  GROUP BY autor_id

Das ist, was ich bisher habe

def sharedDocumentsInstanceList = SharedDocuments.createCriteria().list(params){
    createAlias("autor","a")
    eq("empfänger.id",session.uid)  
    projections{
        groupProperty "autor"
        count "id",'meineanzahl'

    }
     order('meineanzahl','desc')
    maxResults(params.max)
}

Ich habe das zu 90 % funktionierend, wenn ich count oder countDistinct weglasse, erhalte ich eine Liste von verschiedenen Autoren, aber was ich möchte, sind Autoren zusammen mit der Anzahl der Dokumente. Wenn ich also diese Klausel count oder countDistinct zu diesen Kriterien hinzufüge, erhalte ich einfach ein Array von long!! wie [2,3,4] was ich will ist [[autor1,2],[autor2,3] ...] Wie kann ich das erreichen? Ich habe bereits Grails: Projektion auf mehreren Tabellen?, Grails Kriterien Projektionen - Zeilenanzahl abrufen, Grails groupProperty und order. Wie funktioniert es?, aber keine der Antworten scheint mein Problem zu lösen!

1voto

Nguyen Le Punkte 58

Projections mit Paginierung haben einen Bug, bei dem nur das letzte Feld im Projections-Block zurückgegeben wird. Das aktuelle Grails 2.1.5 hat diesen Bug behoben. Hier ist der gemeldete Bug http://jira.grails.org/browse/GRAILS-9644

0voto

Kelly Punkte 3699

Könnten Sie nicht einfach countBy* verwenden - wie

    SharedDocuments.countByAuthorAndReceiver(user, receiver)

0voto

Hussain Fakhruddin Punkte 3134

Wenn Sie das Ergebnis wie in Ihrer Abfrage beschrieben möchten, benötigen Sie die ID des Autors oder eine andere spezifische Eigenschaft wie E-Mail.

def sharedDocumentsInstanceList = SharedDocuments.createCriteria().list(params){
    eq("receiver.id",session.uid)  
    projections{
        groupProperty "author"
        count "id",'mycount'

    }
     order('mycount','desc')
    maxResults(params.max)
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X