2013-01-22 55 views
3

使用hibernate和spring social,Hibernate在HQL中遇到'@'字符困难

我想通过电子邮件地址查询数据库。 当我做到这一点查询:

公共账号findAccountByUsername(字符串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年1月22日14:37:13090 [DEBUG] [HibernateTransactionManager,doBegin(),569] - 将Hibernate事务公开为JDBC事务[[email protected]] 2013-01-22 14:3 7:13,352 [DEBUG] [QueryTranslatorImpl,parse(),272] - parse() - HQL:FROM masterPackage.model.orm.Account as account WHERE account.username = [email protected] 2013-01-22 14: [回调] [HibernateTransactionManager,doRollback(),672] - 回滚Session上的Hibernate事务[HibernateTransactionManager,doRollback(),672] [email protected]] 2013年1月22日14:37:13385 [DEBUG] [JDBCTransaction,回滚(),186] - 回滚

.......

2013-01-22 14:37:18,818 [WARN] [ProviderSignInController,oauth2Callback(),177] - 处理OAuth2回调时的异常(意外的字符:'@'[FROM masterpackage.model.orm.Account as account WHERE account.username = [email protected]])。重定向到/登录

有没有办法解决这个问题?

总是有一种方法可以将@字符保存为电子邮件地址中的其他字符,但我问是否有更好的解决方案。

回答

3

不连接HQL查询。改为使用named parameters。它是Hibernate中的一个实现Query Object Pattern

对于您的情况:

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:推荐有去无回这种方法无效值。最好是返回一个空集合。例如返回新的ArrayList <>();因此你可以隐式使用Null Object pattern

+0

谢谢。这工作。我对Hibernate有点新鲜。不知道你不能做这样的事情。 – Gleeb