如何在 Grails 中创建子查询

How to create sub query in Grails

我使用 Grails 3.2.0.M2 和 PostgreSQL 9.4.1.

我正在创建 Web API,其中 returns 销售数据为 JSON。 Url 是这样的 http //localhost/sales?userId=001&limit=10

有如下三个域class,分别是销售、销售详情和商品域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, 但我不知道如何加入三个 table 和限制。 如何在 Grails 中创建查询?

我对您将 id 定义为字符串感到有点困惑。

在这种情况下,您必须在域-class 映射中使用以下内容定义 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]