[英]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的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密钥。 我想允许用户访问该应用程序,但是我想获取其用户名,因为该用户名存储在数据库中。
我必须为此执行标准吗?
我个人会去(作为namedQuery)
SELECT * FROM `table` WHERE LOWER(`Login`) = LOWER("EXAMPLE@hotmail.com")
但是还有其他方法。
我终于实现了使用休眠标准解决该问题的方法。 除了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.