2016-09-14 104 views
0

我使用Grails 3.2.0.M2和PostgreSQL 9.4.1。如何在Grails中創建子查詢

我正在創建Web API,它將銷售數據作爲JSON返回。 Url就像這樣http // localhost/sales?userId = 001 & limit = 10

有三個領域類,即sales,sales details和item domain class,如下所示。

class Sales { 
    String id 
    String userId 

    static hasMany = [salesDetail: SalesDetail] 
} 

class SalesDetail { 
    String id 
    int count 
    int status 

    static belongsTo = [sales: Sales, item: Item] 
} 

class Item { 

    String id 
    String itemName 
    int price 
} 

我想加入這些域並通過條件檢索數據並限制銷售行數。 例如,如果我在域數據如下時獲得http // localhost/sales?limit = 2 。

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 

我想要一個包含兩個銷售域數據的JSON。

{ 
    "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 
     } 
     ] 
    } 
    ] 
} 

如果在SQL中,我認爲查詢如下所示。

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 

我讀http://gorm.grails.org/6.0.x/hibernate/manual/index.html#criteria, 但我不知道如何加入三個表和限制。 如何在Grails中創建查詢?

+0

您可以使用HQL和裁縫它接近你的SQL查詢:HTTP:/ /stackoverflow.com/questions/39453576/grails-2-5-1-hibernate-3-criteria-multiple-joins-to-same-table/39468326#39468326 – Vahid

回答

0

我有點困惑你的id定義爲String。

你將不得不在這種情況下,定義在域級映射以下標識:

static mapping = { 
    id generator: 'assigned' 
} 

,並通過自己提供的ID。

爲您的其他問題的解決方案可能是:

def query = Sales.where { 
     salesDetail { 
      item.itemName == 'Book' 
     } 
    } 

    respond query.list([sort: 'userId', max: 2]) 

您也可以嘗試與限制:

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

Tanky你解決我的問題! >我有點困惑你的id定義爲String。 對不起。我忘了寫我的靜態映射。 靜態映射= { id生成:「UUID」 } – Keizo

+0

我試過你的答案,並得到像[選擇...銷售THIS_內部聯接sales_detail sales_details1_上this_.id = sales_details1_.sales_id內加入執行的查詢項目item1_ on sales_details1_.item_id = item1_.id其中item1_.item_name =?限制?]我可以加入三個表格,但限制子句 適用於連接的表格。它限制SalesDetail行數。 有沒有辦法像上面的JSON一樣限制銷售行數? – Keizo

+0

你可以嘗試(但我認爲次優,因爲它限制不是查詢,只有結果列表)與**響應query.list([sort:'userId'])[0..1] ** – susi