Hibernate with difficulty with "@" character in HQL

Working with the sleeper and spring social,

I am trying to query a database by email. when i make this request:

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();       }

      

I am getting this exception

2013-01-22 14: 37: 13,090 [DEBUG] [HibernateTransactionManager, doBegin (), 569] - Submit Hibernate Transaction as JDBC Transaction [ 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] - Initiating a rollback of a transaction 2013-01-22 14: 37: 13.384 [DEBUG] [HibernateTransactionManager, doRollback (), 672] - Rollback a Hibernate transaction in session [ org.hibernate.impl.SessionImpl@294a7134 ] 2013-01-22 14: 37: 13,385 [DEBUG] [JDBCTransaction, rollback (), 186] - rollback

.......

2013-01-22 14: 37: 18,818 [WARN] [ProviderSignInController, oauth2Callback (), 177] - Exception while processing OAuth2 callback (unexpected char: '@' [FROM masterpackage.model.orm.Account as WHERE account .username = myEmail@gmail.com ]). Redirect to / signin

Is there a way to get around this problem?

There is always a way to store the @ symbol in an email address as some other symbol, but I am asking if there is something better than this solution.

+3


source to share


1 answer


Not HQL query concatenation. Use named parameters instead . This is an implementation of the Hibernate Request Object Pattern .

In your case:

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;
}

      




Offtop: It is recommended to never return null for such a method. Better to return an empty collection. For example, return a new ArrayList <> (); So you can implicitly use the Null Object pattern .

+3


source







All Articles