尝试在freemarker中创建min(a,b)函数失败

时间:2015-09-04 17:24:44

标签: java freemarker

我需要一种方法在FreeMarker中找到最少两个值,我尝试这样做,但它失败了:

WITH p as (
   SELECT 2 as ID
), allFriend AS (    
    SELECT CASE 
              WHEN f.user_id = p.id THEN f.friend_id
              ELSE f.user_id
          END myFriend
    FROM friends f, p
    WHERE f.user_id = p.ID or f.friend_id = p.ID
    and f.pending = 0
)
SELECT myFriend, Count(*)
FROM allfriend f 
inner join friends f1 
  on  f.myFriend = f1.user_id 
  OR  f.myFriend = f1.friend_id 
    WHERE f1.pending = 0
GROUP BY myFriend

而不是在两行上打印出0.280617,我得到了这个:

<#function min a b>
  <if a gt b>
    <#return b />
  <else>
    <#return a />
  </if>
</#function>

   ...

/* min#1 ${min(0.280617, 1.0)} */
/* min#2 ${min(1.0, 0.280617)} */

为什么呢?我该如何解决?

2 个答案:

答案 0 :(得分:3)

<if ...>只是静态文本(因为它不以<#或任何其他保留模式开头),函数忽略静态文本(它们不输出任何内容),所以你的函数有刚刚在第一个#return返回,这是无条件运行的,因为<if ...>只是静态文本。 (非空白静态文本应该是一个错误,但是在10年以后,这将是非常向后兼容的修复...也许在2.4中会有一个选项来修复这样的事情。)

另请注意,该功能可以用更简单的形式编写(需要2.3.23):

<#function min(a, b)>
  <#return (a < b)?then(a, b)>
</#function>

答案 1 :(得分:2)

叽。这是有效的:我只是不知道为什么......如果我使用<#if>而不是<if>,我曾经在函数末尾从Freemarker收到错误。现在它似乎工作正常。

<#function min a b>
  <#if a gt b>
    <#return b />
  <#else>
    <#return a />
  </#if>
</#function>