1

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

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

当用户登录应用程序时,我的问题就出现了。Hibernategetload方法似乎返回一个带有用户在登录表单中键入的密钥的对象。我正在尝试以下代码:

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

我必须为此实施标准吗?

4

2 回答 2

1

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

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

但还有其他方法。

请参阅 MySQL 不区分大小写的选择

于 2013-06-06T08:15:31.330 回答
0

我终于实现了使用 Hibernate Criteria 来解决它。我使用了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);
        }
    }
于 2013-06-06T10:37:16.627 回答