使用瞬态字段查询和排序grails中数据库的结果

时间:2010-03-12 15:55:57

标签: hibernate grails gorm encryption

我正在尝试从grails域对象中显示分页数据。例如: 我有一个域对象Employee,其属性firstName和lastName是瞬态的,并且当调用它们的setter / getter方法时,它们会加密/解密数据。数据以加密的二进制格式保存在数据库中,因此不能按这些字段排序。而且,再次,也不能被瞬态分类,如下所述: 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)       
}

}

1 个答案:

答案 0 :(得分:2)

由于执行GORM / hibernate标准的方式,这不起作用。这些订单指令被转换为SQL,并且只能在非瞬态字段上运行,因为它发生在数据库层。

您的选择是:

  1. 将查询结果加载到内存中,并使用未加密的值对自己进行排序和分页。
  2. 使用数据库的加密功能和自定义查询(例如“select * from employee order by AES_DECRYPT(lastName, key)”)。请注意,这会给您的数据库带来很多额外负担。
  3. 以未加密的形式存储可用于排序的内容。示例:lastName的前几个字母。但是,这会泄漏您试图保持安全的一些信息。