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

为此,我有一个Waffle,其中包含许多Condiments,但present上的任何Waffle可能有也可能没有。 Waffle具有当前使用的table number,并且属于Restaurant,后者具有许多Name s转换为不同的language

从技术上讲,我需要获取Waffle处的每个Waffle.shape == 'square',并通过RestaurantName处的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”。

07-27 20:23