【问题标题】:How to create sub query in Grails如何在 Grails 中创建子查询
【发布时间】:2016-09-14 08:05:47
【问题描述】:

我使用 Grails 3.2.0.M2 和 PostgreSQL 9.4.1。

我正在创建以 JSON 形式返回销售数据的 Web API。 网址是这样 http://localhost/sales?userId=001&limit=10

共有三个域类,分别是销售、销售明细和项目域类,如下所示。

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 中创建查询?

【问题讨论】:

标签: grails grails-orm


【解决方案1】:

我对你的 id 定义为 String 有点困惑。

在这种情况下,您必须在域类映射中定义具有以下内容的 id:

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]

【讨论】:

  • 你对我的问题表示不满! > 我对你的 id 定义为 String 有点困惑。对不起。我忘了写我的静态映射。静态映射 = { id 生成器:'uuid' }
  • 我已经尝试了您的答案并得到了执行的查询,例如 [select ... from sales this_ inner join sales_detail sales_details1_ on this_.id=sales_details1_.sales_id inner join item item1_ on sales_details1_.item_id=item1_ .id 其中 item1_.item_name = ?限制?] 我可以加入三个表,但限制子句适用于加入的表。它限制 SalesDetail 行数。有没有办法像上面的 JSON 那样限制销售行数?
  • 您可以尝试使用 respond query.list([sort: 'userId'])[0..1 ]
  • 如果这没什么,那有帮助,您甚至可以调用本机 SQL,如下所述:mrhaki.blogspot.de/2014/03/…
猜你喜欢
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
相关资源
最近更新 更多