2013-08-26 13 views
7

私は、stringtemplate内のハイバネートクエリ結果を反復したいと思います。私は例を探していましたが、何も見つかりませんでした。stringtemplateのjavaリストはどのように反復処理しますか?

助けてもらえますか?おかげ

+2

Javaコレクションを繰り返し処理できる場合は、そこに結果リストを送信して実行できます。それはどんなテンプレートエンジンのためのかなりの標準でなければなりません... – Thihara

答えて

4
%staffForOrg: {staff| 
    <tr> 
     <td><a href="#%staff.id%a" class="directory " id="%staff.id%1" onclick="javascript: window.location='StaffInfo.html?id=%staff.id%';">%staff.telephoneNumber%</a></td> 

    </tr> 
}% 

このコードは完璧に動作します。

staffForOrgは私のモデルのリストです。私はレコードを取得するために休止状態を使用しました。

18

構文はJavaでそれを一緒に置く

<items :{ item | <item> }> 

次のようになります。この例では

List<String> teams = Arrays.asList("Cats", "Birds", "Turtles"); 
ST s = new ST("<teams :{team | <team> }>"); 
s.add("teams", teams); 
System.out.println(s.render()); 

を私はリストと印刷それぞれを反復します。

Cats Birds Turtles 

これを実現する構文を調べることができます。これを行う前に、StringTemplateのデフォルトの区切り文字は<より小さく、>よりも大きいことに注意してください。別の区切り文字を指定しなかったので、例で使用する区切り文字になります。 See more about delimiters

:{ } 

シンボルのセットは、結腸:及び開閉ブレース{}「が各々について」として読み取ることができます。サンプルテンプレートでは、teamごとにteamsの印刷teamにコードが読み込まれます。垂直パイプ|の左側には、反復ごとに作成される変数が示されています。チームのリストから現在のチームを保持します。印刷物は、垂直パイプ|の右側にある<team>と閉じ括弧}の左側で構成されています。垂直パイプ|の右側で、終了基底}の前にあるものは、印刷されると評価されます。

:{ current value | everything in here will be printed } 

概念を構築するために、より複雑なデータ構造を使用しましょう。

public class Player { 
    private String name; 
    private int age; 

    public Person(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 
    public int getAge() { return age; } 
    public String getName() { return name; } 
} 

今、私たちは私たちのチームのいくつかの選手を作成することができます。

Player[] players = new Player[] { 
    new Player("Bill", 29), 
    new Player("Steve", 30), 
    new Player("Toby", 15) 
}; 

String playerTemplate = "<players:{ player |<player.name> is <player.age> <\\n>}>" 
ST s = new ST(playerTemplate ); 
s.add("players", Arrays.asList(players)); 
System.out.println(s.render()); 

注意すべき事柄の

Bill is 29 
Steve is 30 
Toby is 15 

カップルの結果を与えます。私たちはプロパティの年齢と名前に直接アクセスしませんでした。 STはメソッドgetAgeとgetNameを呼び出しました。 STはプロパティを調べません。その代わりに、アクセス方法を探します。

別のリストを含むリストを繰り返し処理したい場合はどうすればいいでしょうか。私たちもそうすることができます。 まず、データ構造を構築し、いくつかのリストを記入しましょう。

List<List<String>> listOfLists = asList(
    asList("One", "Two", "Three"), 
    asList("Four", "Five"), 
    asList("Six", "Seven", "Eight", "Nine") 
); 

テンプレートは次のようになります。

<list :{ items |<items :{ item |<item> }><\n>}> 

この場合のテンプレートは、単に組み合わせになります。外殻は、我々が手になるリストを反復します。

<list :{ items | what we will print }> 

次に、各項目について、我々はそのリスト内の項目を出力します。私たちは一緒に

String template = "<list :{ items |<items :{ item |<item> }><\\n>}>"; 
ST st = new ST(template); 
st.add("list", listOfLists); 
System.out.println(st.render()); 

をそれをすべて入れたら

<items :{ item |<item> }> 

は、我々は次のようになり、結果を取得します。

One Two Three 
Four Five 
Six Seven Eight Nine 

このコンセプトをもう少し構築すると、プレーヤーのリストを含む2番目のデータ構造を作成できます。これは反復の中でどのように反復するかを実証するでしょう。

最初に必要なのは、リストを含むデータ構造です。このために、我々は選手がチームになるようにチームを作ることができます。

public class Team { 
    private List<Player> players; 
    private String name; 

    public Team (String name, List<Player> players) { 
     this.players = players; 
     this.name = name; 
    } 

    public List<Player> getPlayers() { 
     return players; 
    } 

    public String getName() { 
     return name; 
    } 
} 

チームにはプレイヤーが含まれています。この構成は、2つの反復を構築することを可能にする。

私たちのデータ構造では、いくつかのプレイヤーといくつかのチームを作るためにすべてをまとめることができました。

List<Team> teams = asList(
     new Team("Billings", asList(
       new Player("Bill", 29), 
       new Player("Steve", 30), 
       new Player("Toby", 15) 
     )), 
     new Team("Laurel", asList(
       new Player("Chad", 32), 
       new Player("Chuck", 29), 
       new Player("Will", 24), 
       new Player("Ben", 26) 
     )) 
); 

は今すぐテンプレートを作成し、いくつかの詳細に記入することができます:

String simpleTeamTemplate = "<teams:{ team |<team.name> has <length(team.players)> players<\\n>}>"; 

ST template = new ST(simpleTeamTemplate); 
template.add("teams", teams); 

System.out.println(template.render()); 

私たちの単純なテンプレートがから私たちの最初のテンプレートとしてだけでほぼ同じである

Billings has 3 players 
Laurel has 4 players 

をプリントアウトすることを上記。唯一の違いは、メソッドlength()のビルドを使用していることです。 See more on functions here

テンプレートの複雑さを2番目の繰り返しで少し増やしましょう。

まず、playersTemplateを作成します。これは上記のplayerTemplateテンプレートとほぼ同じです。唯一の違いは、teamteam.playersから来るプレイヤーがいることです。

String playersTemplate = "<team.players :{ player |<player.name> is <player.age><\\n>}>"; 

次に、最初のテンプレートを含む2番目のテンプレートを作成します。このテンプレートでは、チームごとに反復することができ、チームごとにname、プレイヤー数length(team.players)、およびすべてがplayersTemplateに印刷されます。

String teamTemplate = "<teams:{ team |<team.name> has <length(team.players)> players<\\n>"+playersTemplate+"}>"; 

これですべてをまとめてみましょう。

ST teamsTemplate = new ST(simpleTeamTemplate); 
teamsTemplate.add("teams", teams); 

System.out.println(teamsTemplate.render()); 

これは、私たちのために以下を印刷します。

Billings has 3 players 
Bill is 29 
Steve is 30 
Toby is 15 
Laurel has 4 players 
Chad is 32 
Chuck is 29 
Will is 24 
Ben is 26 

ここで、あなたは本当にこのようにテンプレートを組み合わせるつもりはありません。テンプレートを作成するために文字列を追加することはむしろ愚かです。 StringTemplateは、部分テンプレートのこの組み合わせを非常に簡単にするツールを提供します。テンプレートを組み合わせることに興味がある場合は、より多くのものを見つけることができます。here

+0

Cats(例えばfor)がクラスCatsであり、文字列ではない場合、どうなるでしょうか。私が言いたいことは、リスト内にリストが存在するかどうかです。どうすればその問題を解決できますか?私はそれを解析する問題に直面しており、「このような要素の例外はありません」となっています。誰か助けてもらえますか? – AnirbanDebnath

+1

私はあなたの質問に完全にコメントすることができるのか分かりません。私は試みます。自分のクラスを反復処理している場合は、gettersを呼び出すことができます。この例では、各チームがgetNameメソッドを持つTeamクラスであるとします。そのメソッドを呼び出すと呼ぶことができます。 "チーム:{チーム| }" " インターフェイスチーム{ public String getName(); } @AnirbanDebnath –

+1

@AnirbanDebnath私はあなたの質問に答えるための例を更新しました。私はそれが助けて欲しい –

関連する問題