hibernate和string主键,大小写

xkrw2x1b  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(277)

我的数据库中有一个tlogin表,它的主键是 String 类型,称为login。这个密钥不是由hibernate自动生成的,因为它是由应用程序分配的。以下是Map:

<id name="_Login" column="Login" unsaved-value="null">
    <generator class="assigned" />
</id>

我的问题出现在用户登录应用程序时。冬眠 get 以及 load 方法似乎返回了一个带有用户在登录窗体中键入的键的对象。我正在尝试以下代码:

@Override
public CLogin loadLogin(String userName) throws AccessException {
    try {
        Session sesion = this._dao.init();
        CLogin login = (CLogin) sesion.get(CLogin.class, userName);
        return login;
    } catch (HibernateException e) {
        throw new AccessException(e.getMessage(), e);
    }
}

例如,这里甚至用户名也存储为example@hotmail.com 在数据库中,如果最终用户使用example@hotmail.com,它将从数据库中检索对象,但是example@hotmail.com 钥匙。我想允许用户访问应用程序,但我想得到他的用户名,因为它存储在数据库中。
我必须执行一个标准吗?

inb24sb2

inb24sb21#

我个人会去(作为一个命名查询)

SELECT * FROM `table` WHERE LOWER(`Login`) = LOWER("EXAMPLE@hotmail.com")

但还有其他方法。
请参阅mysql不区分大小写选择

rlcwz9us

rlcwz9us2#

我最终实现了使用hibernate标准来解决它。我用一个 ilike 限制是一种不敏感的类型,除了 MatchMode.Exact ,只允许筛选完全匹配的。
这就是它的工作原理:

public CLogin loadLogin(String userName) throws AccessException {
        try {
            Session sesion = this._dao.init();
            CLogin login = (CLogin) sesion.createCriteria(CLogin.class).add(
                    Restrictions.ilike("_Login", userName.toLowerCase(), MatchMode.EXACT))
                    .uniqueResult();
            if (login == null) {
                throw new AccessException("User does not exist");
            }
            return login;
        } catch (HibernateException e) {
            throw new AccessException(e.getMessage(), e);
        }
    }

相关问题