2013-01-22 74 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