在Grails中使用数据库查询按集合排序

时间:2013-10-11 21:11:42

标签: grails collections hql gorm

我的最新发明是一个系统,您可以在世界各地的餐馆实时跟踪华夫饼。

为实现这一目标,我的WaffleCondimentspresentWaffle中任何Waffle都可能是table numberRestaurant目前有Namelanguage,属于WaffleWaffle.shape == 'square'Restaurant被翻译成不同的Name

从技术上讲,我需要将每个Waffle.Restaurant.Names.language == 'en'放在Condiment.present的位置,然后在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] } Waffle {{1}}的位置进行排序,并显示{{1}是真的。

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

以下是类的简化版本:

{{1}}

如果可能的话,我想在GORM中这样做,但HQL也是可以接受的。这是Grails 2.3。请记住,这是分页的,因为世界上有数百万{{1}}个,如果不是更多的话!

1 个答案:

答案 0 :(得分:1)

基于标准:

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”。