如何在Grails

时间:2016-09-14 08:05:47

标签: grails gorm

我使用Grails 3.2.0.M2和PostgreSQL 9.4.1。

我正在创建Web API,将销售数据作为JSON返回。 Url就像这个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中创建查询?

1 个答案:

答案 0 :(得分:0)

我对你的id-definition为String感到有些困惑。

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

export class ExpFactory {
    createInstance(type:string) : IExp{
      if(type=="A") return new A();
      else return new B();
    }
}

并自己提供id。

您的其他问题的解决方案可能是:

static mapping = {
    id generator: 'assigned'
}

您也可以尝试限制:

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

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