4

休止状態および春のソーシャルでの作業、

メールアドレスでデータベースをクエリしようとしています。私がこのクエリを行うとき:

public Account findAccountByUsername(String username){

    Session session = sessionFactory.getCurrentSession();
    String selectQuery = "FROM Account as account WHERE account.username = "+username;
    Query query = session.createQuery(selectQuery);
    @SuppressWarnings("unchecked")
    List<Account> results = query.list();

  if (!results.iterator().hasNext())
        return null;        
    return results.iterator().next();       }

この例外が発生します

2013-01-22 14:37:13,090 [DEBUG] [HibernateTransactionManager、doBegin()、569]-HibernateトランザクションをJDBCトランザクションとして公開[com.mchange.v2.c3p0.impl.NewProxyConnection@3b249bb2] 2013-01-22 14 :37:13,352 [DEBUG] [QueryTranslatorImpl、parse()、272] --parse()-HQL:FROM masterPackage.model.orm.Account as account WHERE account.username = myEmail@gmail.com 2013-01-22 14: 37:13,383 [DEBUG] [AbstractPlatformTransactionManager、processRollback()、843]-トランザクションロールバックの開始2013-01-22 14:37:13,384 [DEBUG] [HibernateTransactionManager、doRollback()、672]-セッションでのHibernateトランザクションのロールバック[org .hibernate.impl.SessionImpl @ 294a7134] 2013-01-22 14:37:13,385 [DEBUG] [JDBCTransaction、rollback()、186]-ロールバック

.....。

2013-01-22 14:37:18,818 [WARN] [ProviderSignInController、oauth2Callback()、177]-OAuth2コールバックの処理中に例外が発生しました(予期しない文字:'@' [FROM masterpackage.model.orm.Account as account WHERE account.username = myEmail@gmail.com])。/signinにリダイレクトする

この問題を回避する方法はありますか?

メールアドレスの@文字を他の文字として保存する方法は常にありますが、この解決策よりも優れたものがあるかどうかを尋ねています。

4

1 に答える 1

4

HQLクエリを連結しないでください。代わりに名前付きパラメーターを使用してください。これは、 Hibernateでのクエリオブジェクトパターンの実装です。

あなたの場合:

Session session = sessionFactory.getCurrentSession();
String selectQuery = "FROM Account as account WHERE account.username = :usernameParam";
Query query = session.createQuery(selectQuery);
query.setParameter("usernameParam", username);
@SuppressWarnings("unchecked")
List<Account> results = query.list();

if(results.isEmpty()){
    return null;
} else {
    return result;
}

オフトップ:このようなメソッドにはnull値を返さないことをお勧めします。空のコレクションを返すことをお勧めします。たとえば、return new ArrayList <>(); したがって、 NullObjectパターンを暗黙的に使用できます。

于 2013-01-22T12:59:28.907 に答える