如何在 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]
我使用 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]