hibernate - 使用 transient 字段在 grails 中查询和排序数据库结果

标签 hibernate grails grails-orm encryption

我正在尝试显示 grails 域对象中的分页数据。例如: 我有一个域对象 Employee ,其属性firstName和lastName是 transient 的,当调用它们的setter/getter方法时,它们会加密/解密数据。数据以加密的二进制格式保存在数据库中,因此无法按这些字段排序。再说一遍,也不能按 transient 排序,如下所示: http://www.grails.org/GSP+Tag+-+sortableColumn .

所以现在我正在尝试找到一种以类似于以下方式使用 transient 的方法:

Employee.withCriteria( max: 10, offset: 30 ){
    order 'lastName', 'asc'
    order 'firstName', 'asc'
} 

类(class)是:

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/hibernate 标准的执行方式,这是行不通的。这些订单指令被转换为 SQL,并且只能对非 transient 字段进行操作,因为它发生在数据库层。

您的选择是:

  1. 将查询结果加载到内存中,并使用未加密的值自行进行排序和分页。
  2. 使用数据库的加密功能和自定义查询(例如“通过 AES_DECRYPT(lastName, key) 从员工订单中选择 *”)。请注意,这会给您的数据库带来大量额外负载。
  3. 以未加密的形式存储可用于排序的内容。示例:姓氏的前几个字母。但是,这会泄露您试图确保安全的一些信息。

关于hibernate - 使用 transient 字段在 grails 中查询和排序数据库结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2433916/

相关文章:

Grails 3 - 移动到插件时域不允许 Map 构造函数

java - 在 Hibernate 中只获取最后一条记录,但我想要所有记录

java - Hibernate CriteriaQuery 如何查找具有两个条件的整数列表

grails - 使用Grails动态创建Div

grails - 为连接到另一个域的复合主键的外键创建 Grails 域映射

image - 删除上传的图像

Grails 3.3 执行H2脚本命令

grails - 不使用 domain.delete() 时 Grails 会级联删除吗?

java - Hibernate - 非工作代码以及什么是服务注册表

java - Spring + hibernate 。创建 bean 时出错。不满足的依赖。无法弄清楚什么注释不正确