首页 > 解决方案 > @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;
    }

标签: javahibernate

解决方案


推荐阅读