2011-06-02 52 views
0

我的Freemarker地圖有一個奇怪的問題。我的例子是指與相關業主的姓名,以顯示汽車列表:隨機訪問時缺少Freemarker中map(key,value)的值嗎?

Car(id,name,ownerId)

User(id,name)

注意,ownerId是我可以從car訪問owner唯一的橋樑。出於某些原因,我們不爲這些域創建hibernate關係。

我添加到模型列表Car(id,name,ownerId)carList並含有(userId, name)所有用戶Map<String, String> map ..這是因爲Freemarker的唯一類型爲String的鍵接受地圖。

在循環播放carList時,我嘗試通過地圖獲取所有者名稱。

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

但是奇怪的是,結果我得到:

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

的用戶「5」名稱缺失,但在數據庫中存在。此外,當我遍歷圖的結果是正確的:

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

結果:

1 - Tom 
2 - Jerry 
3 - Mickey 
4 - David 
5 - Mike 

缺少的名字碰巧只有特定的用戶。有誰知道這裏缺少什麼?

+0

注意:沒有太多的用戶和汽車(兩者都不超過100個),所以我認爲加載它們並不是一個問題。 – 2011-06-02 08:38:49

回答

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將數字轉換爲未格式化的字符串的字符串)。

+0

它的工作原理!但我不知道它是如何工作的。你能給我一些資源嗎? – 2011-06-02 10:47:41

+0

哪一部分完全不瞭解?一般來說,閱讀優秀的FreeMarker文檔(http://freemarker.org/docs/index.html)是個不錯的主意,在你的案例中,特別是關於從哈希中檢索數據的部分(http://freemarker.org /docs/dgui_template_exp.html#dgui_template_exp_var_hash)。 – Chaquotay 2011-06-03 13:22:37

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>