Grails и Hibernate createCriteria игнорируют промежуточные пробелы в подобном предложении

Версия Grails: 3.0.7

Крутая версия: 2.4.4

Версия JVM: 1.8.0_51

У меня есть следующий запрос в службе Grails, и мой вопрос заключается в том, как «игнорировать» пробел в середине значения поля, такого как почтовый индекс.

Например, желаемый результат состоит в том, что «LL551RB» будет соответствовать аналогичному предложению для «LL55 1RB», хранящемуся в базе данных. И наоборот, решение было бы простым, удалить пробел из значения запроса, но я не могу определить, как удалить его из значений базы данных.

Я пробовал варианты ниже, которые, пока они выполняются, не совпадают правильно.

    def allRecordsMatched = Event.createCriteria().listDistinct {

        or {
            eventCategories {
                like("categoryName", "%" + search + "%")
            }
            like("eventName", "%" + search + "%")
            like("address.town", "%" + search + "%")
            like("address.county", "%" + search + "%")
            like("address.postalCode".replaceAll("\\s",""), "%" + search + "%")
        }
        order("startDateTime", "asc")
    }

    return [results, allRecordsMatched]

person Robin M    schedule 21.12.2015    source источник
comment
Вы можете переписать его в hql и использовать в нем функцию TRIM (FIELD) (не уверен, что она работает в hql, но в sql она работает.   -  person Koloritnij    schedule 21.12.2015
comment
вы должны удалить ненужные пробелы либо перед сохранением вашего почтового индекса, либо с помощью фонового задания. Все другие методы приведут к большей сложности запроса и снижению производительности поиска.   -  person injecteer    schedule 21.12.2015
comment
@injecteer Хороший вопрос. Я удалил пробелы, содержащиеся в существующих записях в БД, и реализовал сеттер в классе домена, чтобы удалить все пробелы, а также преобразовать буквы в верхний регистр.   -  person Robin M    schedule 21.12.2015


Ответы (1)


Вы можете использовать sqlRestriction для замены всех пробелов в значении столбца перед его сопоставлением с параметром поиска. например.:

address{
    Restrictions.sqlRestriction("REPLACE(postal_code, ' ', '') like %$search%")
}
person Sandeep Poonia    schedule 21.12.2015
comment
Спасибо за предложение. Хотя я выбрал другое решение, я не смог заставить работать вышеперечисленное. Где я должен разместить это объявление в блоке кода? - person Robin M; 21.12.2015