プレイ中のビューテンプレートからJPAクエリを実行する方法
-
29-09-2019 - |
質問
ビューテンプレートから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()
. 。これを行う正しい方法は何ですか?
解決
ページでこれを実行しようとする代わりに(悪い練習)、またはすべてのコントローラーに追加する代わりに、注釈付きの方法で1つの親コントローラーに追加する必要があります @Before
. 。これにより、各ページで呼び出されるため、コードを1回だけ実行する必要があります。
例えば。親コントローラー(別名インターセプター)は次のようになります。
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>
元のコードが機能しなかった理由については、わかりません。おそらく、モデルクラスがプレイによってどのように強化されるかと関係がありますか?
他のヒント
それを回避する方法を発見しましたが、私はまだ元のコードの何が悪いのかを知りたいと思っています。私はそれをするだけでそれを動かしました
<ul>
#{list items: models.Building.findAll(), as: 'building'}
<li>#{a @Buildings.edit(building.code)}${building}#{/a}</li>
#{/list}
</ul>
所属していません StackOverflow