java - @ColumnTransformer 未在选择中使用
问题描述
[编辑] 找到解决方案:
问题是主键是字段用户名。Hibernate 似乎没有处理这种情况。所以我将主键切换到另一个字段来修复它并且它有效!
我正在尝试对我的数据库使用加密,但是当我想获取数据时遇到了一些问题。
列转换器未在 select 子句中使用,但在 where 子句中工作。
当查询是表的 select * 时出现此错误,例如:
public interface UserRepository extends JpaRepository<User, String> {
@Query(value = "select a from User as a where username = :username")
AdminUser findByUsername(@Param("username") String username);
}
(@Query 在这种情况下没用,但它有一个例子)
Hibernate 生成的查询如下所示:
SELECT user0_.username AS username1_0_, user0_.creation_date AS creation2_0_, user0_.last_update_date AS last3_0_, user0_.enabled AS enabled4_0_, AES_DECRYPT(user0_.email, unhex('myKey'),'myVector') AS email5_0_, user0_.password AS password6_0_, user0_.password_expiration_date AS password7_0_, user0_.profil_id AS profil8_0_
FROM my_user_table user0_
WHERE AES_DECRYPT(user0_.username, unhex('myKey'), 'myVector') = 'userTest';
如果是这样的查询:
@Query(value = "select a.username from User as a where username = :username")
选择子句被解密。
任何想法为什么 Hibernate 不在 select 中使用 columnTransformer ?谢谢,
@Table(name = "my_user_table")
public class User extends AbstractEntity implements UserDetails {
@Id
@Column(name = "username", nullable = false, unique = true, columnDefinition = "${encryption.column.definition}")
@ColumnTransformer(
forColumn = "username",
read ="${User.username.read}",
write ="${User.username.write}")
private String username;
@Column(name = "password", nullable = false)
private String password;
@Column(name = "email", nullable = false, columnDefinition = "${encryption.column.definition}")
@ColumnTransformer(
read ="${User.email.read}",
write ="${User.email.write}")
private String mailAddress;
@Column(name = "password_expiration_date", nullable = false)
private Date passwordExpirationDate;
@OneToMany(targetEntity = OldPassword.class, fetch = FetchType.LAZY, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinColumn(name = "username", nullable = true)
@OrderBy("creationDate desc")
private List<OldPassword> oldPasswords;
/**
* Use this field to enable or disable an account manually
*/
@Column(name = "enabled", columnDefinition = "bit default 0", nullable = false)
private boolean enabled;
@Transient
private Collection<? extends GrantedAuthority> authorities;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "profil_id", referencedColumnName = "id")
private Profil profil;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "user_places", joinColumns = @JoinColumn(name = "username"))
private List<String> userPlaces;
}
解决方案
推荐阅读
- angular - 从方法内的可观察对象返回一个值
- kubernetes - 在 StatefulSet 中,如果由于 ImagePullBackOff 而不断失败,pod 会继续尝试多长时间?
- c# - nuget 命令失败:错误 MSB4236:找不到指定的 SDK 'Microsoft.NET.Sdk'
- sql-server - 使用存储在 table1 中的列名从 table2 中检索数据
- rust - 只需要 TryFrom 的 From 的要求
- javascript - Bootstrap 5 offcanvas 错误:未捕获的 TypeError:无法读取未定义的属性“parentNode”
- xcode - AppleTV:无法在设备上启动远程服务
- java - java spring boot中调用外部服务时找不到证书链
- excel - 尝试从 SharePoint URL 下载文件并打开时出错
- python - Python/Pandas:用于迁移的 .CSV 数据清理