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

使用hibernate和spring社交,

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

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 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上回滚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回调时出现exception(意外字符:’@'[FROM masterpackage.model.orm.Account as account WHERE account.username = myEmail@gmail.com])。 重定向到/登录

有办法解决这个问题吗?

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

不要连接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 results = query.list(); if(results.isEmpty()){ return null; } else { return result; } 

Offtop:建议永远不要为此方法返回null值。 更好的是返回一个空集合。 例如,返回new ArrayList <>(); 因此,您可以隐式使用Null对象模式 。