1

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

为了实现这一点,我有一个Waffle其中有很多Condiments,其中任何一个都可能在也可能present不在Waffle. Waffletable number它当前打开,并且属于一个Restaurant有许多Names 被翻译成不同language的 s。

从技术上讲,我需要获取每个Waffle位置并按's whereWaffle.shape == 'square'排序并显示是否为真。RestaurantNameWaffle.Restaurant.Names.language == 'en'Condiment.present

Restaurant.Names = ['language':'en', 'name':'Waffle House'],
                   ['language':'fr', 'name':'Le Waffle House'],
                   ['语言':'de','名称':'Das Waffle House']
按方形过滤
==============================

(升序)
    五
餐厅餐桌#糖浆黄油蛋黄酱
-------------------------------------------------- --------
丹尼的 42 YYN
丹尼的 27 NNN
丹尼的 11 YYN
IHOP 10 YNN
IHOP 7 神经网络
华夫饼屋 10 YYY

这是类的简化版本:

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 一起使用。请记住,这是分页的,因为世界上有数百万个Waffles,如果不是更多的话!

4

1 回答 1

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

于 2013-10-11T21:47:47.997 回答