簡體   English   中英

休眠和字符串主鍵,區分大小寫的負載

[英]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的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密鑰。 我想允許用戶訪問該應用程序,但是我想獲取其用戶名,因為該用戶名存儲在數據庫中。

我必須為此執行標准嗎?

我個人會去(作為namedQuery)

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

但是還有其他方法。

參見MySQL不區分大小寫的選擇

我終於實現了使用休眠標准解決該問題的方法。 除了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM