使用params的grails域类.list()方法

时间:2014-08-21 12:03:03

标签: grails gorm grails-domain-class

我有两个与一对多关系相关的域 - 一个用户可能有很多关联。我想查看属于该用户的所有关联。我正在使用脚手架插件。所以应该在AssociationController中返回关联列表的代码看起来很简单:

def index(Integer max) {
    respond Association.list(params), model:[associationInstanceCount: Association.count()]
}

在用户视图页面上,我有以下代码:

<g:form controller="Association" >
    <fieldset class="buttons">
        <g:hiddenField name="user.id" id="user.id" value="${userInstance.id}"/>
        <g:actionSubmit class="list" action="index" value="${message(code: 'default.list.label', default: 'Show Associations')}"/>
    </fieldset>
</g:form>

当我按下此动作时,提交user.id随请求一起发送,它在params地图内(我通过调试检查)但由于某种原因,Association.list(params)返回所有关联(对于所有用户),尽管事实上我在params中使用这个user.id。还尝试将user.id重命名为user,但它也无效。看起来像这样.list()应该只用于排序或者我做错了。你能帮我解决这个问题吗?谢谢!

3 个答案:

答案 0 :(得分:5)

澄清给定的答案:list( params )返回域对象的所有结果,并仅接受排序(order by)和view-port(limit / offset)参数。它不提供任何where子句(除了discriminator - 列)

更新:

您可以使用findAllBy*

Association.findAllByUserId( params.long( 'user.id' ), params )

criteria如果您需要使查询更复杂:

Association.withCriteria{
   eq 'id', params.long( 'user.id' )
   maxResults params.int( 'max' ) ?: 10
   firstResult params.int( 'offset' ) ?: 0
   if( params.sort && params.order ) order params.sort, params.order
}

答案 1 :(得分:4)

根据Grails documentation,list不会将id作为参数。

看到你的最大值,它将是Association.list(max: max),而你想要的是:

Association.findAllByUserId(params.id, [max: max])

params.id包含所需用户的id(或params['user.id'])。

更多关于findAllBy...

答案 2 :(得分:2)

不确定之前的回复,但是:

Association.where { 
  user {
    eq 'id', params['user.id']
  }
} .list()

如果使用分页,可以将params添加到列表调用。

另一种解决方案:

def index(User user) {
  respond user.associations, , model:[associationInstanceCount: user.associations.size()]
}

但是你必须为你的param'id'命名 这主要取决于您如何设计域对象以及您的目标是什么。