Built-ins
Материал из DevelopmenOnTheEdge
Built-ins во Freemarker — это встроенные суффиксы к значениям (через вопросительный знак), которые выполняют какие-либо преобразования. К примеру, ${"<test>"?html} вернёт <test>
.
Мы определили ряд дополнительных built-ins (хотя разработчики Freemarker против этого) для упрощения работы именно в контексте BeanExplorer.
- ?str — превратит строку в sql-строку, используя особенности текущего sql-диалекта. Если аргумент — специальный объект null, то результатом будет строка NULL. Аналог Utils.safestr(connector, text, true). Примеры (для MySQL, в других СУБД результат может отличаться):
-
${"test"}
-> test -
${"test"?str}
-> 'test' -
${null?str}
-> NULL -
${"test'quotes'"?str}
-> 'test''quotes''' -
${concat('col1', ' - '?str, 'col2')}
-> CONCAT( col1, ' - ', col2 )
-
- ?quote — обернёт в кавычки идентификатор, если это необходимо. Пример (для MySQL):
-
SELECT ${'___whoModified'?quote} FROM myTable
-> SELECT `___whoModified` FROM myTable
-
- ?asVarchar — добавит преобразование SQL-числа к строке. Примеры (для MySQL):
-
${"ID"?asVarchar}
-> CAST( ID AS CHAR ) -
${concat('ID = '?str, 'ID'?asVarchar)}
-> CONCAT( 'ID = ', CAST (ID AS CHAR) )
-
- ?asDate — добавит преобразование SQL-строки к дате.
- ?asInt — добавит преобразование SQL-строки к числу.
- ?asPK — добавит преобразование к типу Primary Key. Пример (для MySQL):
-
${'mycolumn'?asPK}
-> CAST( mycolumn AS BIGINT )
-
- ?upper — добавит SQL для преобразования в верхний регистр
- ?upperFirst — добавит SQL для преобразования первого символа в верхний регистр, а последующих — в нижний.
- ?lower — добавит SQL для преобразования в нижний регистр
- ?idCase — добавит SQL для преобразования в регистр идентификаторов базы данных (если требуется)
- ?dateFormat — добавит SQL для форматирования даты в виде YYYY-MM-DD
- ?dateFormatRus — добавит SQL для форматирования даты в виде DD.MM.YYYY
- ?dateTimeFormat — добавит SQL для форматирования даты и времени в виде YYYY-MM-DD HH:MM:SS
- ?year — создаёт SQL для извлечения года из даты
- ?month — создаёт SQL для извлечения месяца из даты
- ?day — создаёт SQL для извлечения дня месяца из даты
- ?yearStart — создаёт SQL для получения первого дня года
- ?monthStart — создаёт SQL для получения первого дня месяца
- ?orEmpty — сокращённый вариант для coalesce(arg, ''?str). Пример (для MySQL):
-
${concat('nameSpace'?orEmpty, 'name'?orEmpty
)}
-> CONCAT( COALESCE(nameSpace,''),COALESCE(name,'') )
-
- ?roles — развернёт список ролей и групп ролей в просто список ролей через запятую без повторов. Пусть в проекте определены группы @Managers (Manager, Admin) и @Users (User, Manager). Тогда:
-
${'@Managers,@Users,Guest'?roles}
-> 'Admin,Guest,Manager,User'
-
Совет: используйте скобки, если хотите применить суффикс к сложному выражению. Например, для запросов второго уровня:
SELECT ${
(
'SELECT '+concat('name', ' = '?str, 'value') + ' FROM table1'
)?str
} AS "Data;<sql/>" FROM table2
Альтернатива такому синтаксису: использовать предопределённый макрос <@str>:
SELECT <@_str>SELECT ${concat
('name', ' = '?str, 'value')} FROM table1</@>
AS "Data;<sql/>" FROM table2
Тут дело вкуса.