1

在我们的应用程序中,我们有一个 Player 可以有游戏和练习计划,因此我们设计了抽象类 Plan 和两个派生类 GamePlan 和 PracticePlan。在数据库中,派生类被保存到具有“类”属性的单个表中。

当我们对特定玩家使用 getPlans() 时,我们会获得所有计划,但我们想知道如何仅获得游戏或练习计划。类似 player.getPracticePlans() 或 Player.PracticePlans(player_id) 的东西。以下是我们的课程。

class Player  {

    String name
    static hasMany = [ plans : Plan] 
}

abstract class Plan {
}

class PracticePlan extends Plan{
}

class GamePlan extends Plan{
}

注意:我们尝试使用类似的东西:

def query = Player.where {
    plans {  class == "GamePlan" }
}   

但是该类是保留关键字,并且无法编译。

4

2 回答 2

1

我相信你可以这样做来加载一个人的所有计划,然后过滤掉不需要的计划:

def gamePlansForPlayer = Player.get( id ).plans.findAll { plan ->
  plan.instanceOf( GamePlan )
}

虽然没有测试过:-(

于 2012-06-29T14:53:54.620 回答
0

您应该能够使用getClass(). 请参阅此答案:Groovy / grails 如何确定数据类型?.

您还可以使用Criteria,它将列放在引号中,这样它就不会遇到保留字问题:

def plans = Player.withCriteria {
    plans {
        eq('class', "com.name.space.GamePlan")
    }
}

(请注意,我使用命名空间指定类名,因为这就是它在我的经验中的存储方式。YMMV。)

如果这可行并且您想让它更通用,您可以将其变成命名查询并将类作为参数提供:

def namedQueries = {
    plansByClass = { clazz ->
        plans {
            eq('class', clazz)
        }
    }
}

然后,您可以像调用静态方法一样调用它:

def plans = Player.plansByClass('GamePlan')

请注意,虽然我确实在我的应用程序中使用了 Criteria,但这些特定示例并未经过测试。

于 2015-11-05T20:00:22.390 回答