繁体   English   中英

休眠和字符串主键,区分大小写的负载

[英]Hibernate and String primary key, case sensed load

我的数据库中有一个tlogin表,该表具有String类型的主键,称为Login 该密钥不是由Hibernate合法生成的,因为它是由应用程序分配的。 这是映射:

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

用户登录应用程序时出现我的问题。 Hibernate的getload方法似乎返回一个具有用户已在登录表单中键入的键的对象。 我正在尝试以下代码:

@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密钥。 我想允许用户访问该应用程序,但是我想获取其用户名,因为该用户名存储在数据库中。

我必须为此执行标准吗?

我个人会去(作为namedQuery)

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

但是还有其他方法。

参见MySQL不区分大小写的选择

我终于实现了使用休眠标准解决该问题的方法。 除了MatchMode.Exact ,我还使用了ilike限制,它是like的不敏感类型, 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);
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM