我想遍历字符串模板中的休眠查询结果。我一直在寻找例子,但我找不到任何东西。
你能帮忙吗?谢谢
语法看起来像
<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());
在此示例中,我遍历列表并打印列表中的每个团队teams
。将打印的结果是:
Cats Birds Turtles
我们可以探索实现这一点的语法。在我们这样做之前,请记住,StringTemplate 中的默认分隔符是小于<
和大于>
。由于我们没有指定不同的分隔符 <
>
,因此我们将在示例中使用。查看有关分隔符的更多信息
:{ }
这组符号、冒号:
和左右大括号{}
可以读作“for each”。在示例模板中,代码读取printteam
中的每个。垂直管道的左侧表示将为每次迭代创建的变量。它将保存团队列表中的当前团队。印刷品由竖管右侧和闭合支架左侧组成。垂直管道右侧和关闭底座之前的任何内容都将被评估为打印。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 }>
然后对于每个项目,我们将打印出其列表中的项目。
<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
我们的简单模板与上面的第一个模板几乎相同。唯一真正的区别是我们使用的是 ST 提供的内置方法length()
。在此处查看有关功能的更多信息
让我们稍微增加模板的复杂性,以便在我们的第二次迭代中添加。
首先,我们将创建我们的playersTemplate
. 这几乎与我们playerTemplate
上面的模板相同。唯一的区别是我们的玩家来自team
: team.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 提供了一些工具来使这种部分模板的组合变得非常容易。如果您对组合模板感到好奇,可以在此处了解更多信息
%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 是我的模型列表。我使用休眠来检索记录。