我的数据库中有一个tlogin表,其主键为String
类型,名为登录。此密钥不是由Hibernate自动生成的,因为它是由应用程序分配的。这是映射:
<id name="_Login" column="Login" unsaved-value="null">
<generator class="assigned" />
</id>
用户登录应用程序时出现问题。 Hibernate 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 键。我想允许用户访问应用程序,但我想获取用户名,因为它存储在数据库中。
我是否必须为此实施标准?
答案 0 :(得分:1)
我个人会(作为命名查询)
SELECT * FROM `table` WHERE LOWER(`Login`) = LOWER("EXAMPLE@hotmail.com")
但还有其他方法。
答案 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);
}
}