Написание EnhancedUserType для сохранения строковой информации в Hibernate, избегая SQL-инъекций - PullRequest
0 голосов
/ 28 октября 2011

У меня есть какая-то сущность, такая как Адрес.Из-за проблем с производительностью я хочу сохранить всю сущность в одном поле, например "улица; почтовый индекс; город".

Для этого можно создать EnhancedUserType.В некоторых примерах, которые я обнаружил, и в источниках hibernate метод objectToSQLString всегда реализован так:

@Override
public String objectToSQLString(Object object) {
    if (object != null) {
        Address oo = (Address)object;
        return "'" + oo.toSomeString() + "'";
    } else {
        return "";
    }       
}

Я не понимаю, возвращает ли метод представление SQL или нет.Почему специальные символы, такие как ['], не экранируются внутри строки?Как мне избежать их?Стандартным способом SQL для экранирования является ['] -> [' '], но на некоторых диалектах [backslash] также необходимо экранировать.

Есть ли какая-нибудь утилита Hibernate, которая может сделать экранирование для меня зависимымна диалекте?Как Hibernate сам решает эту проблему?Я не смог найти его в исходном коде: - (

1 Ответ

1 голос
/ 28 октября 2011

Вы действительно должны вернуть строку литерала SQL, заключенную в одинарные кавычки, и с внутренними областями видимости. AFAIK, нужно избегать только одинарных кавычек, удваивая их: 'O''Reilly'. По крайней мере, именно это делает (или делала) Apache commons-lang StringEscapeUtils.

Но я сомневаюсь, что вы получите что-нибудь, поместив весь адрес, подобный этому, в один столбец. И вы потеряете возможность запроса по отдельным полям адреса. Вы измерили, что эти три поля вызвали проблему с производительностью, и что размещение их в одном столбце решит проблему?

...