1

我正在尝试从视图模板执行 JPA 查询,但它不起作用(我已经使用 phpMyAdmin 验证了有记录)。我知道这通常应该通过控制器完成并传入 via render,但这是构建将出现在每个页面上的菜单的一部分,我不想修改每个控制器来完成此操作。

我目前正在尝试的是

<ul>
%{
    import models.Building;
    List<Building> buildings = Building.findAll();
}%
#{list items: buildings, as: 'building'}
    <li><a href="">${building}</a></li>
#{/list}
</ul>

但我收到错误The template /app/views/Networks/grid.html does not compile : unexpected token: (引用调用的行findAll()。这样做的正确方法是什么?

4

2 回答 2

4

而不是尝试在页面中执行此操作(不好的做法)或将其添加到每个控制器中,您应该将其添加到一个父控制器中,方法是使用@Before. 这将在每个页面上调用,因此您只需要执行一次代码。

例如。父控制器(又名拦截器)看起来像:

public class ControllerInterceptor extends Controller {
   @Before
   public static void intercept() {
      RenderArgs.current().put("buildings", Building.findAll());
   }
}

然后每个控制器将添加以下注释:

@With(ControllerInterceptor.class)
public class MyController extends Controller {
...
}

然后您的页面代码将像您已经在做的那样引用它:

<ul>
    #{list buildings, as: 'building'}
    <li>#{a @Buildings.edit(building.code)}${building}#{/a}</li>
    #{/list}
</ul>

至于为什么您的原始代码不起作用,我不确定。可能与 Play 如何增强 Model 类有关?

于 2010-11-07T22:30:51.067 回答
1

发现了如何解决它,但我仍然想知道原始代码有什么问题。我只是做

<ul>
    #{list items: models.Building.findAll(), as: 'building'}
    <li>#{a @Buildings.edit(building.code)}${building}#{/a}</li>
    #{/list}
</ul>
于 2010-11-05T03:05:23.740 回答