列表（list）页面中，如何配置默认查询条件?
李小翔
2014-09-25 09:54

内容列表
方式一 	 # 
方式二 	 # 
方式三 	 # 
方式四 	 # 

    显示某个domain的列表界面时，有时候需要默认只显示一部分数据，比如仅显示本年度的员工报销信息，对应属性 year。
    假如打开列表的链接配置在某个导航中，在bro-framework中，有如下几种实现方式，并且在应用场景上有略微的差异。

方式一
    列表界面中包含如下代码，用户可以选择年份进行查询：
 年份: <g:select name=”d.year” from=”${ (2010..2030)} ” noSelection=”[’’:’’]” />
    如果不希望用户能自行选择年份，可以设置css将这个select隐藏起来。
    在导航的链接中添加参数 “search.where” 和 “search.year”，前者代表查询hql的where条件部分，后者表示2013这个值将作为默认值显示在上面的年份下拉列表中，如：
 <g:link controller=’foobar’ params=”${ [’search.d.where’:’d.year=2013’, ‘search.d.year’:’2013’]} ” target=....>Foobar</g:link>

方式二
    如果希望用户不能自行选择年份，而且也不想使用css来隐藏列表框，仅需要修改导航链接，采用如下的参数：
   [’search.where’:’d.year=2013’, ’search.where_precondition’:’d.year=2013’]
    BroFWK 4.2后，简化为：
   [’search.precondition’:’d.year=2013’]

方式三
    如果既不希望用户自行选择，还希望不带额外的参数打开list页面，直接显示本年度的信息。也就是说，限定死只能显示本年度信息。
    可以直接修改控制器里的list模板，在查询的hql中带上年度条件即可，注意的是 xxx.count() 也需要改成条件查询如 xxx.countByYear(2013)，如：
 Foobar.findAll(”from ${ c1}  d where year=2013 ${ orderBy} ”, [], params);

方式四
    方式三显然太缺乏灵活性了，可以略微改进一下。
    在 list.gsp 的 form 标签内，增加一个隐藏的input，如：
 <input type=”hidden” name=”year” value=”${ params.year} ” />
    然后在控制器中，根据params.year进行查询，如：
   if ( !params.year ) params.year = 2013;
   Foobar.findAll(”from ${ c1}  d where year=${ params.year}  ${ orderBy} ”, [], params);