Запрос и упорядочивание результатов базы данных в Grails с использованием временных полей

StackOverflow https://stackoverflow.com/questions/2433916

Вопрос

Я пытаюсь отобразить постраничные данные из объекта домена 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 и могут работать только с непереходными полями, поскольку это происходит на уровне базы данных.

Ваш выбор:

  1. Загрузите результаты запроса в память и самостоятельно выполните сортировку и разбиение на страницы с незашифрованными значениями.
  2. Используйте возможности шифрования вашей базы данных и собственный запрос (например,"select * from employee order by AES_DECRYPT(lastName, key)").Будьте осторожны, это создаст дополнительную нагрузку на вашу базу данных.
  3. Храните что-либо в незашифрованном виде, что можно использовать для сортировки.Пример:первые несколько букв фамилии.Однако это приводит к утечке некоторой информации, которую вы пытаетесь сохранить в безопасности.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top