Hibernate在HQL中遇到'@'字符有困难

时间:2013-01-22 12:50:36

标签: java spring hibernate hql spring-social

使用hibernate和spring social,

我正在尝试通过电子邮件地址查询数据库。 当我这样做时:

  

公共帐户findAccountByUsername(字符串用户名){

    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] - 在Session [org.hibernate.impl.SessionImpl@294a7134]上回滚Hibernate事务   2013-01-22 14:37:13,385 [DEBUG] [JDBCTransaction,rollback(),186] - rollback

     

.......

     

2013-01-22 14:37:18,818 [WARN] [ProviderSignInController,oauth2Callback(),177] - 处理OAuth2回调时出现异常(意外的字符:&#39; @&#39; [FROM masterpackage.model。 orm.Account as account WHERE account.username = myEmail@gmail.com])。重定向到/ signin

有办法解决这个问题吗?

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

1 个答案:

答案 0 :(得分: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:建议永远不要为此方法返回 null 值。更好的是返回一个空集合。例如,返回new ArrayList&lt;&gt;();因此,您可以隐式使用Null Object pattern