Hibernate 在 HQL 中处理“@”字符时遇到困难

Gle*_*eeb 5 java spring hibernate hql spring-social

使用 Hibernate 和 Spring Social,

我正在尝试通过电子邮件地址查询数据库。当我执行此查询时:

公共帐户 findAccountByUsername(String 用户名) {

    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();       }
Run Code Online (Sandbox Code Playgroud)

我得到这个异常

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:来自masterPackage.model.orm.Account作为帐户,其中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] - 回滚会话上的 Hibernate 事务 [org .hibernate.impl.SessionImpl@294a7134] 2013-01-22 14:37:13,385 [调试] [JDBCTransaction,rollback(),186] - 回滚

…………

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

有办法解决这个问题吗?

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

Tak*_*aky 4

不要连接 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<Account> results = query.list();

if(results.isEmpty()){
    return null;
} else {
    return result;
}
Run Code Online (Sandbox Code Playgroud)

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