不区分大小写的JPA唯一约束?

时间:2014-03-25 20:30:20

标签: jpa constraints

我目前正在使用

@Entity
public class ... {

    /**
     * @return the loginName
     */
    @Column(unique=true)
    public String getLoginName() {
        return loginName;
    }

但是喜欢使用不区分大小写的约束,以便登录名称" UPPERCASE"当已有登录名时,不允许使用#34;大写"在数据库中。有什么我可以使用或者我必须创建在单独的列中存储小写版本的脏解决方法吗?

1 个答案:

答案 0 :(得分:2)

这不是JPA所涵盖的内容,我甚至不说实现(例如Hibernate)。

你可以做的一件事就是创建一个@PrePersist and @PreUpdate handler来填充另一个(附加的)实体字段,并使用规范化(小写)值,并对其进行约束。

@Entity Foo { 
    private value;
    @Column(unique = true)
    private valueLowercased;

    @PrePersist @PreUpdate private prepare(){
        this.valueLowercased = value == null ? null : value.toLowerCase();
    }
}

非JPA方法可能是使用myColumnLowercased的附加列UNIQUE INDEX以及将值设置为LOWERCASE(new.myColumn)的触发器。 (术语可能因数据库而异。)

一些databases support "functional indexes",您可以通过表达式进行索引。

CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));