我的最新发明是一个系统,您可以在其中实时跟踪世界各地饭店的华夫饼。
为此,我有一个Waffle
,其中包含许多Condiments
,但present
上的任何Waffle
可能有也可能没有。 Waffle
具有当前使用的table number
,并且属于Restaurant
,后者具有许多Name
s转换为不同的language
。
从技术上讲,我需要获取Waffle
处的每个Waffle.shape == 'square'
,并通过Restaurant
的Name
处的Waffle.Restaurant.Names.language == 'en'
对其进行排序,并显示Condiment.present
是否为真。
Restaurant.Names = ['language':'en', 'name':'Waffle House'], ['language':'fr', 'name':'Le Waffle House'], ['language':'de', 'name':'Das Waffle House']
Filtered by square shaped ============================ (Ascending order) V Restaurant Table# Syrup Butter Mayo --------------------------------------------------------- Denny's 42 Y Y N Denny's 27 N N N Denny's 11 Y Y N IHOP 10 Y N N IHOP 7 N N N Waffle House 10 Y Y Y
Here's a simplified version of classes:
class Condiment {
int condimentId
boolean present
Waffle waffle
static belongsTo = [Waffle]
}
class Waffle {
int waffleId
int tableNumber
String shape
Restaurant restaurant
static belongsTo = [Restaurant]
static hasMany = [condiments:Condiment]
}
class Restaurant {
int restaurantId
static hasMany = [waffles:Waffle, names:Name]
}
class Name {
String name
String language
static hasMany = [restaurants:Restaurant]
}
我希望在GORM中这样做,但HQL也可以接受。这是Grails 2.3。请记住,这是分页的,因为世界上有数百万个
Waffle
,甚至更多! 最佳答案
基于标准:
def waffles = Waffle.createCriteria().list(offset: 0, max: 100){
eq('shape', 'square')
restaurant{
names{
eq('language', 'en')
order('name', 'asc')
}
}
condiments{
eq('present', true)
}
}
基于HQL:
def query = """
select w from Waffles as w \
inner join w.restaurant as r \
inner join w.condiments as c \
inner join r.names as n \
where w.shape = :shape \
and n.language = :lang \
and c.present is true
"""
def waffles = Waffle.executeQuery(query,[shape: 'square', lang: 'en',
max: 100, offset: 0])
将为您带来前100个华夫饼。
基于HQL的方法将是有效的,因为不会急切获取餐厅,名称和调味品(在上述条件下使用Criteria的情况下)。
将法语的
lang
更改为“fr”。