11 января 2013 г.

Приведение строки к любому типу в PostgreSQL

Для приведения строки к нужному типу в postgres достаточно после строкового литерала поставить два двоеточия и указать тип данных, к которому следует привести строку. Примеры:
'123'::integer
'2013-01-11'::timestamp
Это очень полезное свойство можно использовать при динамической генерации условий запроса совместно с параметризованными запросами jdbc. А в качестве значений параметров для унификации всегда хранить только строки.

Приведу код на java в качестве иллюстрации этого подхода.
// здесь указан запрос на выборку из БД всех записей
// (то есть не задано никаких дополнительных условий)
StringBuilder whereExpressionBuilder = new StringBuilder("select * from messages m");
// обработка условий, заданных пользователем
if (fromDate != null && !fromDate.isEmpty()) {
   whereExpressionBuilder.append(" where m.created >= ?::timestamp ");
}
PreparedStatement ps = connection.prepareStatement(whereExpressionBuilder.toString());
ps.setString(1, fromDate);

Объект fromDate - это обычная строка, которая приходит от клиента, например, из браузера. В этой строке содержится дата в текстовом представлении. Нам нужно к исходному sql-запросу добавить соответствующее условие. Но чтобы избежать sql-инъекций, формируем параметризованный запрос (PreparedStatement). Вместо знака вопроса будет подставлено нужное нам значение. А в качестве этого значения устанавливаем строку fromDate.

Конечно, данный подход не идеален. Хотя бы потому что здесь приходится генерить запрос к БД вручную. Для подобных целей лучше использовать ORM (например, Hibernate). Но если использовать ORM не представляется возможным, то преобразование строки к нужному типу в postgres значительно облегчает эту задачу.

Комментариев нет:

Отправить комментарий