2017-05-22 3 views
0

im mit Grails 2.4.5Grails executeQuery subquery

Ich will die Top-3-Kunden abgerufen werden basierend darauf, wie viele Aufträge sie haben

im diesem Code

def customers = Customer.executeQuery("Select cu, (Select count(*) from Contract co where co = cu.contract) from Customer cu", 
              [max: 3]) 

und es auszuführen versuchen gibt diesen Fehler zurück

linken und rechten Seiten eines binären Logikoperators wurden inkompatibil [com.cms.Contract: java.util.Set (com.cms.Customer.contract)]

ich verstehe, dass die co-und cu.contract-typen nicht die gleichen sind, aber ich verstehe nicht warum. kann mir jemand helfen wie diese executeQuery von grails funktioniert. Dies ist das einzige Framework, das ich verwende, das eine statische Abfrageausführung hat, aber trotzdem einem bestimmten Format folgen muss.

, was ich wirklich tun möchte, ist eine Abfrage wie diese

Select * from Customer cu order by (Select count(*) from Contract co where co.id = cu.id) 

Antwort

1

Sie einen mit Vorsprüngen Criteria Abfrage versuchen könnte zu generieren:

def results = Customer.createCriteria().list() { 
    createAlias('contracts', 'contractalias') 
    projections { 
     groupProperty('contractalias.contract') 
     count('contractalias.contract', 'contractCount') 
    } 
    maxResults(3) 
    order 'contractCount', 'desc' 
} 

Ich bin nicht 100% Ihrer Feldnamen musste also in obiger Abfrage davon ausgehen.

Es ist oft nützlich, sql-Protokollierung beim Ausprobieren dieser Abfragen zu aktivieren, z. füge der Entwicklung hinzu DataSource

development { 
    dataSource { 
    ... 
    logSql = true 
    } 
}