Запрос и упорядочивание результатов базы данных в Grails с использованием временных полей
-
19-09-2019 - |
Вопрос
Я пытаюсь отобразить постраничные данные из объекта домена Grails.Например:У меня есть объект домена «Сотрудник» со свойствами firstName и LastName, которые являются временными, и при вызове их методов установки/получания они шифруют/дешифруют данные.Данные сохраняются в базе данных в зашифрованном двоичном формате, поэтому сортировка по этим полям невозможна.И опять же, их нельзя сортировать по временным, как отмечено в:http://www.grails.org/GSP+Tag+-+sortableColumn .
Итак, теперь я пытаюсь найти способ использовать переходные процессы примерно так:
Employee.withCriteria( max: 10, offset: 30 ){
order 'lastName', 'asc'
order 'firstName', 'asc'
}
Класс:
class Employee {
byte[] encryptedFirstName
byte[] encryptedLastName
static transients = [
'firstName',
'lastName'
]
String getFirstName(){
decrypt("encryptedFirstName")
}
void setFirstName(String item){
encrypt("encryptedFirstName",item)
}
String getLastName(){
decrypt("encryptedLastName")
}
void setLastName(String item){
encrypt("encryptedLastName",item)
}
}
Решение
Это не может работать из-за способа выполнения критериев GORM/спящего режима.Эти директивы заказа переводятся в SQL и могут работать только с непереходными полями, поскольку это происходит на уровне базы данных.
Ваш выбор:
- Загрузите результаты запроса в память и самостоятельно выполните сортировку и разбиение на страницы с незашифрованными значениями.
- Используйте возможности шифрования вашей базы данных и собственный запрос (например,"
select * from employee order by AES_DECRYPT(lastName, key)
").Будьте осторожны, это создаст дополнительную нагрузку на вашу базу данных. - Храните что-либо в незашифрованном виде, что можно использовать для сортировки.Пример:первые несколько букв фамилии.Однако это приводит к утечке некоторой информации, которую вы пытаетесь сохранить в безопасности.