как использовать ilike с Integer в grails
Я использую плагин EasyGrid и должен найти значения, где целое поле, такое как " %001%"
initialCriteria {
ilike('id', "%"+params.id+"%")
}
но ilike не работает с Integer. Как это сделать?
Я попытался сделать:
initialCriteria {
ilike('id'.toString(), "%"+params.id+"%")
}
initialCriteria {
ilike('str(id)', "%"+params.id+"%")
}
но это не работает.
5 ответов
Если id
- целое число в базе данных, затем ilike
на самом деле не имеет большого смысла, и, вероятно, есть лучший способ сделать то, что вы пытаетесь сделать (например, добавить поле типа или что-то в объект домена и фильтровать по типу)
initialCriteria {
sqlRestriction "cast( id AS char( 256 ) ) like '%001%'"
}
вы могли бы сделать:
String paddedId = params.id.toString().padLeft(3,'0')
initialCriteria {
ilike('id', "%$paddedId%")
}
решение, предлагаемое tim_yates с sqlRestriction, будет работать в версии 1.5.0 easygrid. Одно из главных отличий от 1.4.x заключается в том, что источник данных gorm больше не использует DetachedCriteria, а критерии, которые непосредственно сопоставляются с API критериев Hibernate.
Так что вы можете попробовать его на последнюю версию. (Имейте в виду, что обновление может нарушить существующие сетки. Есть также много других изменений)
еще одно маленькое наблюдение, что initialCriteria является не самое подходящее место для таких вещей. (это не так, но есть свойство "globalFilterClosure" для применения независимых фильтров столбцов)
я смешал код, опубликованный @tim_yates и мой:
String paddedId = params.id.toString().padLeft(3,'0')
def crit = Book.withCriteria {
sqlRestriction "lpad(cast( id AS char( 256 ) ), 3, '0') like '%${paddedId}%'"
}
Я пробовал с H2 в памяти db, и он работает, но я не уверен в двух вещах:
- реальная польза от этого
-
lpad
синтаксическая консистенция во всех движках БД
YMMV
Следующий критерий не работает, если вы от поле для поиска пользователя текстовый символ by ошибка как 12dfdsf в качестве идентификатора для поиска. Это даст вам исключение
initialCriteria {
ilike('id', "%"+params.id+"%")
}
для лучшего использования вы можете использовать следующие критерии
initialCriteria {
sqlRestriction "id like '%${params?.id}%'"
}