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

我一段时间以来都在使用grails.还有一些我还不知道如何正确实现的东西.

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

目前我正在通过以下方式进行:

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

class UserLink{
    User user
    String className
    Long refId
}

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

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

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

谢谢,
萨科

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

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

然后找到实现它的所有域类,并使用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()
点赞