Grails One-To-Many与抽象类

时间:2012-06-29 13:51:11

标签: hibernate grails groovy gorm single-table-inheritance

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

当我们在特定玩家上使用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" }
}   

但是这个类是一个保留的关键字,它不能编译。

2 个答案:

答案 0 :(得分:1)

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

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

虽然没有测试过: - (

答案 1 :(得分:0)

您应该可以使用def plans = Player.withCriteria { plans { eq('class', "com.name.space.GamePlan") } } 获得课程。请参阅此答案:Groovy / grails how to determine a data type?

您还可以使用Criteria,这会将列添加到引号中,因此它不会遇到保留字问题:

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

(请注意,我指定了带有命名空间的类名,因为它是如何根据我的经验存储的.YMMV。)

如果这样做并且您想使其更通用,您可以将其变为named query并将该类作为参数提供:

def plans = Player.plansByClass('GamePlan')

然后将其称为静态方法:

$('#tabId a[href="#s' + targetId + '"]').click(function (e) {
        e.preventDefault();
});

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