1

DB にLoginStringというタイプの主キーを持つ tlogin テーブルがあります。このキーは、アプリケーションによって割り当てられるため、Hibernate によって自動的に生成されるわけではありません。ここにマッピングがあります:

<id name="_Login" column="Login" unsaved-value="null">
    <generator class="assigned" />
</id>

私の問題は、ユーザーがアプリケーションにログインしたときに発生します。Hibernategetloadメソッドは、ユーザーがログイン フォームに入力したキーを持つオブジェクトを返すようです。私は次のコードを試しています:

@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としてDB に保存されている場合、エンド ユーザーがEXAMPLE@hotmail.comでログインすると、DB からオブジェクトが取得されますが、EXAMPLE@hotmail.comキーが使用されます。ユーザーにアプリへのアクセスを許可したいのですが、DBに保存されているユーザー名を取得したいです。

そのための基準を実装する必要がありますか?

4

2 に答える 2

1

私は個人的に(namedQueryとして)行きます

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

しかし、他の方法があります。

MySQL の大文字と小文字を区別しない選択を参照 してください

于 2013-06-06T08:15:31.330 に答える
0

私はついにHibernate Criteriaを使ってそれを解決することに成功しました。私は、完全一致のみをフィルタリングできる に加えて、 likeilikeの非依存型である制限を使用します。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);
        }
    }
于 2013-06-06T10:37:16.627 に答える