代码之家  ›  专栏  ›  技术社区  ›  Brad Mace Mike King

如何在play中从视图模板进行JPA查询

  •  1
  • Brad Mace Mike King  · 技术社区  · 14 年前

    我试图从视图模板中执行JPA查询,但它不起作用(我已经使用phpMyAdmin验证了是否有记录)。我知道这通常应该通过控制器完成,然后通过 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() . 正确的方法是什么?

    2 回复  |  直到 14 年前
        1
  •  4
  •   Damo    14 年前

    不要尝试在页面中执行此操作(不好的做法)或将其添加到每个控制器,而应该将其添加到用注释的方法中的一个父控制器 @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增强有关?

        2
  •  1
  •   Brad Mace Mike King    14 年前

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

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