Вопрос

Здравствуйте, ребята, у меня возникают проблемы с точными матчами, когда вы занимаетесь.

В настоящее время я использую что -то вроде этого:

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from Entry e where e.name =:"+ Entry.NAME )

...

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
        query.setParameter(Entry.NAME, myEntry.getName());

Это работает для большинства случаев, однако я заметил, что в случае, если пользователь передаст имя файла с пространством в конце, названнаяквери игнорирует этот символ. Например:

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
        query.setParameter(Entry.NAME, myEntry.getName()+ " ");

Вернет тот же результат, что и запрос ранее. Обход моей «действительной записи» валидации. Другими словами, я хотел бы запрос, чтобы вообще не вернул вход и лечить ошибку позже.

Один обходной путь, о котором я мог бы подумать, - это поставить отдельные цитаты, окружающие мой параметр в названном виде, например:

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from entry e where e.name =':"+ Entry.NAME "'")

Однако он будет мучить свой код в случае, если строка содержит отдельные цитаты в нем ...

Есть идеи, ребята?

Это было полезно?

Решение 2

Я провел некоторые исследования в JPA и обнаружил, что он имеет некоторую автоматическую обрезку для символов, я не уверен, что ведет себя так же с строками, но поскольку это происходит со мной ... Я верю так. Единственный способ обойти его, устанавливая некоторые атрибуты в объекте база данных сеанса (см. http://www.eclipse.org/eclipselink/api/1.1/org/eclipse/persistence/sessions/databaselogin.html#setshouldTrimstrings.) .

Что ж, я не хотел, чтобы быть в сессии, поэтому я решил сделать какую -то проверку и бросить то же исключение, что и улов в Noresultexception в моем коде.

Я в основном получил результат из базы данных и сравнил поле со строкой, которую я использовал:

query.setParameter(Entry.NAME, myEntry.getName());

...

if(!StringUtils.equals(result.getName(), myEntry.getName()){
   do a cool throw just like NoResultException Catch
}

Мне также пришлось включить функцию обрезки Axtavt! Это просто, чтобы убедиться, что если база данных имеет столбец с конечными пробелами, и он соответствует параметру, заданному пользователем, он будет включен в качестве действительного ответа. Например:

Запись базы данных: name = "flavio" - отрезан функцией = "flavio".

Параметр прошел: name = "flavio" - обрезается JPA автоматической функцией = "flavio".

Если он не обрезан вообще, он просто сравнится «Флавио» с «Флавио», возвращая норсульт, когда он должен был вернуть эту запись.

Неправильный обходной путь, но до тех пор, пока нет другого способа остановить автоматическую обрезку, нам придется просто использовать такие вещи.

Спасибо за все другие ответы !!

Другие советы

Я думаю, это происходит, потому что поле вашей базы данных объявляется как CHAR(...), и, следовательно, сохраненные значения дополнены пробелами, которые не принимаются во внимание = операция.

Таким образом, вы можете либо объявить поле базы данных как VARCHAR(...) или использовать встроенный trim Функция:

query = "select e from Entry e where trim(trailing from e.name) =:"+ Entry.NAME
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top