[英]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.