2016-09-14 103 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