GORM:列出属于User(root对象)的所有域实例

时间:2011-05-06 13:16:28

标签: hibernate grails gorm

我一直在使用grails。还有一些我还不知道如何正确实现。

我有一个域类(比方说User),它包含一个List,它可能是任何域类(Item,User等等)。有没有办法让这个开箱即用?

目前我正按以下方式进行:

我有一个UserLink,其中包含以下属性:

class UserLink{
    User user
    String className
    Long refId
}

然后我有一个服务,它为给定用户加载所有链接,然后加载链接中的相应对象,并将它们作为列表返回。

我认为这种做法不是最好的,可能导致未来的性能问题

你怎么看?你有更好的设计理念吗?

谢谢, 尼古拉斯

1 个答案:

答案 0 :(得分:2)

它真的是任何类,还是只有某个类的子集?我相信你会有更多与User没有直接关系的域类。

如果是这样,您可以使用UserAsset道具创建belongsTo=[user: User]类或接口,并继承/实现它。

然后找到实现它的所有域类,并使用clazz.findByUser()查询每个类,如:

GrailsClass[] classes = grailsApplication.getArtefacts('Domain')
GrailsClass[] userAssetClasses = 
    classes.clazz.findAll { UserAsset.class.isAssignableFrom(it) }
List<UserAsset> allUserAssets = 
    userAssetClasses.clazz*.findAllByUser(myUser).flatten()

编辑:如果我们正在谈论M:M,它只会更改最后一行,即查询userAssetClasses的方式。

UserAsset将拥有hasMany=[users:User]属性。

像:

List<UserAsset> allUserAssets = userAssetClasses.clazz.collect{ 
    Class domainClass ->
    it.withCriteria {
        users {
            eq('id', myUser.id)
        }
    }
}.flatten()