我对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>
缺少的名称仅针对特定用户。有谁知道这里缺少什么?
答案 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>