之前用过Hibernate的加密字段感觉还挺好用,于是按照某度的资料兴冲冲的用了:
@MetaDict(value = "系数")
@Column(name = "coeff_", precision = 22, scale = 8, columnDefinition = "BLOB")
@ColumnTransformer(write = "AES_ENCRYPT(?, 'coeff_')", read = "CAST(AES_DECRYPT(coeff_,'coeff_') as char(1000))")
private BigDecimal coeff;
大概说下配置含义:
columnDefinition: BOLB (列采用二进制流的格式保存)
write = "AES_ENCRYPT(?, 'coeff_')" ? 表示加密的当前字段,'coeff_' 表示加密的盐。
然而Hibernate 5升级以后,查询出来的值为Null.
究其原因大概为:比如查询的时候使用连接查询,这里假设要查询对象a.coeff 的值。正常的查询语句应该是:
SELECT AES_DECRYPT(a.coeff_,'a.coeff_') FROM a
但是由于盐的值和列名相同所以也在盐值前面加了表的别名,变为:
SELECT AES_DECRYPT(a.coeff_,'a.coeff_') FROM a
这样盐值不对,查询出来的数据也不对了。