2016-09-14 3 views
0

Ich benutze Grails 3.2.0.M2 und PostgreSQL 9.4.1.So erstellen Sie eine Unterabfrage in Grails

Ich erstelle Web-API, die Umsatzdaten als JSON zurückgibt. Url ist wie folgt http // localhost/sales? UserId = 001 & limit = 10

Es gibt drei Domain-Klassen, die Verkaufs-, Verkaufsdetails und Element-Domain-Klasse sind wie folgt.

Ich möchte diese Domäne beitreten und Daten nach Bedingungen abrufen und Anzahl der Verkaufszeilen begrenzen. Zum Beispiel, wenn ich http // localhost/sales? Limit = 2 für den Fall, dass Domain-Daten wie folgt sind.

Sales 

id  userId 
sales001 user001 
sales002 user002 

SalesDetails 

id    userID salesId itemId count status 
salesDetails001 user001 sales001 item001 1  1  
salesDetails002 user001 sales001 item002 2  1  
salesDetails003 user002 sales002 item001 1  1  
salesDetails004 user002 sales002 item002 3  1  

Item 

id  itemName price 
item001 book  100 
item002 cd  200 

Ich möchte ein JSON erhalten, das zwei Verkaufsdomänen enthält.

{ 
    "sales" : [ 
    { 
     "id": "sales001", 
     "userId": "user001", 
     "salesDetails": [ 
     { 
      "salesId": "sales001", 
      "itemId": "item001", 
      "itemName": "book", 
      "count": 1 
     }, 
     { 
      "salesId": "sales001", 
      "itemId": "item002", 
      "itemName": "cd", 
      "count": 2 
     } 
     ] 
    }, 
    { 
     "id": "sales002", 
     "userId": "user002", 
     "salesDetails": [ 
     { 
      "salesId": "sales002", 
      "itemId": "item001", 
      "itemName": "book", 
      "count": 1 
     }, 
     { 
      "salesId": "sales002", 
      "itemId": "item002", 
      "itemName": "cd", 
      "count": 3 
     } 
     ] 
    } 
    ] 
} 

Wenn in SQL, ich denke, dass eine Abfrage wie folgt ist.

select * from sales s1 
where exists (
select s2.id from sales s2 
inner join sales_details sd on s2.id = sd.sales_id 
inner join item i on sd.item_id = i.id where s1.id = s2.id 
where i.name = 'book' and s1.id = s2.id) // search conditions on Sales, SalesDetails, or Item 
limit 2; // limit Sales 

Ich las http://gorm.grails.org/6.0.x/hibernate/manual/index.html#criteria, aber ich weiß nicht, wie drei Tisch und Grenze zu verbinden. Wie erstellt man eine Abfrage in Grails?

+0

Sie können hql und Schneider es in der Nähe der SQL-Abfrage verwenden: http:/

def query = Sales.where { salesDetail { item.itemName == 'Book' } } respond query.list([sort: 'userId', max: 2]) 

Sie auch mit begrenzen könnten versuchen, /stackoverflow.com/questions/39453576/grails-2-5-1-hibernate-3-criteria-multiple-joins-to-same-table/39468326#39468326 – Vahid

Antwort

0

Ich bin ein bisschen verwirrt über Ihre ID-Definition als String.

Sie müssten in diesem Fall die ID mit den folgenden in der Domain-Klasse-Mapping definieren:

static mapping = { 
    id generator: 'assigned' 
} 

und geben Sie die ID selbst.

die Lösung für Ihre andere Frage könnte sein:

respond query.list([sort: 'userId'])[0..1] 
+0

Tanky Sie für die Beantwortung meiner Frage! > Ich bin etwas verwirrt über Ihre ID-Definition als String. Entschuldigung. Ich habe vergessen, meine statische Zuordnung zu schreiben. statische Zuordnung = { id Generator: ‚UUID‘ } – Keizo

+0

Ich habe Ihre Antwort versucht, und die ausgeführte Abfrage wie [wählen ... aus dem Verkauf this_ Exklusionsverknüpfung sales_detail sales_details1_ bekommen auf this_.id = sales_details1_.sales_id Exklusionsverknüpfung item1_ on sales_details1_.item_id = item1_.id wo item1_.item_name =? Limit?] Ich könnte drei Tabellen beitreten, aber Limit-Klausel funktioniert bei verbundenen Tabellen. Es beschränkt die SalesDetail-Zeilenanzahl. Gibt es eine Möglichkeit, die Verkaufszeilenanzahl wie oben in JSON zu begrenzen? – Keizo

+0

Sie könnten versuchen (aber ich denke suboptimal, weil es nicht die Abfrage beschränkt, nur die resultierende Liste) mit ** antworten query.list ([sort: 'userId']) [0..1] ** – susi

Verwandte Themen