Hibernate和String主键,案例感知负载

时间:2013-06-06 07:47:01

标签: java hibernate

我的数据库中有一个tlogin表,其主键为String类型,名为登录。此密钥不是由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 键。我想允许用户访问应用程序,但我想获取用户名,因为它存储在数据库中。

我是否必须为此实施标准?

2 个答案:

答案 0 :(得分:1)

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

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

但还有其他方法。

请参阅 MySQL case insensitive select

答案 1 :(得分:0)

我终于实现了使用Hibernate Criteria来解决它。除了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);
        }
    }