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.
source to share
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 .
source to share