随机访问时,Freemarker中缺少map(key,value)的值?

时间:2011-06-02 08:33:31

标签: spring-mvc freemarker

我对Freemarker地图有一个奇怪的问题。我的示例是为了显示具有相关所有者名称的汽车列表:

Car(id,name,ownerId)

User(id,name)

请注意,ownerId是我可以从owner访问car的唯一桥梁。出于某些原因,我们不会为这些域创建休眠关系。

我添加了carList的{​​{1}}列表和Car(id,name,ownerId)所有用户Map<String, String> map的列表...这是因为仅限Freemarker接受带有String类型键的Map。

在循环浏览carList时,我尝试通过地图获取所有者名称。

(userId, name)

但奇怪的是我得到了结果:

<#list carList as car>
  ${map?values[car.ownerId]} - ${car.ownerId}<br/>
</#list>

缺少用户“5”的名称,但它存在于数据库中。此外,当我遍历地图时,结果是正确的:

Tom - 1
Jerry - 2
Jerry - 2
David - 4
- 5
- 5

结果:

<#list map?keys as key>
  ${key} - ${map[key]}
</#list>

缺少的名称仅针对特定用户。有谁知道这里缺少什么?

2 个答案:

答案 0 :(得分:3)

警告:包含一些推测!

我认为您的部分问题是您使用map?values[car.ownerId]来检索用户的名字。 map?values为您提供了map哈希值的序列(请参阅FreeMarker documentation),它恰好是用户名的序列。然后你通过索引(而不是userId!)来访问它的元素,它返回大多数情况下的用户名,但是当userId达到你的地图大小时却没有,因为你的map散列中有5个元素,值序列只能从0到4编制索引,而userId的值为1到5。

如果我的理论是正确的,那么使用map[car.ownerId?c]可能会解决您的问题(注意:我认为car.ownerId是数字的,因为map哈希中的键是字符串我使用?c built-in将数字转换为无格式字符串。)

答案 1 :(得分:0)

Chaquotay给出的答案是正确的,尽管我想添加另一种方法来解决这个问题。由于应用程序在将地图用作简单列表时自然会起作用,因此我们可以将其循环,比较结果并在发生相等时进行打印。它有点脏,但它有效。

<#list carList  as car>
  ${car.ownerId} - 
  <#list map?keys as user_id>
    <#if car.ownerId == user_id>${map[user_id]}</#if>
  </#list>
  <br />
</#list>