2013-08-26 62 views
7

我想遍歷stringtemplate中的一個hibernate查詢結果。我一直在尋找例子,但我找不到任何東西。如何遍歷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

的語法看起來像

<items :{ item | <item> }> 

將其組合在一起在Java中:

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

:{ } 

這組符號,結腸:和打開和閉合支架{}可以讀作「對每個」。在示例模板中,代碼讀取teams中的每個team print 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 }> 

然後對於每個項目,我們將打印出列表中的項目。

<items :{ item |<item> }> 

一旦我們把它放在一起

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

我們得到的結果,看起來像下面這樣。

One Two Three 
Four Five 
Six Seven Eight Nine 

基於這個概念,我們可以創建第二個包含玩家列表的數據結構。這將演示如何在迭代中迭代。

我們首先需要的是一個包含列表的數據結構。爲此,我們可以創建一個供我們的球員參與的團隊。

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; 
    } 
} 

請注意,我們的團隊包含玩家。這個組合將允許我們建立兩個迭代。

既然我們有了我們的數據結構,就可以將所有的東西放在一起,組成一些球隊的隊伍。

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

讓我們在第二次迭代中增加一些模板的複雜性。我們將創建playersTemplate。這與我們上面的playerTemplate模板幾乎完全相同。唯一的區別是我們的球員來自teamteam.players

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

現在我們將構建第二個包含第一個模板的模板。在此模板中,我們可以遍歷團隊,併爲每個團隊打印出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(例如)是類Cat而不是字符串,會發生什麼情況。我的意思是說,如果列表中可能有List,那麼該怎麼辦?我如何解決這個問題。我面臨的問題解析,得到「沒有這樣的元素例外」。有人可以請求幫助 – AnirbanDebnath

+1

我不知道我可以在評論中完全解決您的問題。我會嘗試。如果你正在迭代你自己的類,你可以調用getters。在示例中可以說每個團隊都是一個具有getName方法的Team類。我們可以致電,這將調用該方法。 「}>」 interface Team {0} {0} public String getName(); } @AnirbanDebnath –

+1

@AnirbanDebnath我更新了這個例子來回答你的問題。我希望有所幫助。 –