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

我正在使用

@Entity
public class ... {

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

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

最佳答案 这不是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));
点赞