当前位置: 首页 > 面试题库 >

Hibernate在HQL中难以使用'@'字符

许兴文
2023-03-14
问题内容

与hibernate和spring社交一起工作,

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

公共帐户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:从masterPackage.model.orm.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]-在会话[org]上回滚Hibernate事务.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回调时发生异常(意外字符:’@’[FROM
masterpackage.model.orm.Account作为帐户WHERE account.username =
myEmail@gmail.com])。html" target="_blank">重定向到/ signin

有办法解决此问题吗?

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


问题答案:

不要连接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;
}

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



 类似资料:
  • 我正在使用hibernate 4.x,想在HQL查询中设置MySQL的“SQL_NO_CACHE”语句 目前生产 但我想要 但我不知道怎么做。 使用本机查询没有问题,但所有查询都是用HQL编写的,比本例复杂得多。因此,我得到了一个<code>QuerySyntaxException:意外的标记</code>异常,因为在hibernate文档中无论如何都没有记录该语句。 http://docs.jb

  • persistence.xml文件 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd“>org.hibernate.ejb.hibernatePersistence

  • 问题内容: 是否可以将HQL和Criteria API混合使用? 我有一个包含HQL中的where条件的,并且已经构建并从其他地方获取了。我想知道是否可以将where条件添加到中。where条件可以是多个条件“与-或-” /“或-或”在一起。 我可以在不解析where条件的情况下执行此操作吗? 问题答案: 您可以使用Restriction.sqlRestriction(字符串sql)。

  • 问题内容: 我正在使用和。我以前在sql中使用过正则表达式,现在是我第一次在HQL中使用它。 这是我的hql,当我不带功能运行它时,它按预期运行。但是我不能用表达式执行它。 它说.. 嵌套的异常是org.hibernate.hql.ast.QuerySyntaxException:意外的AST节点:(靠近第1行,第66列..... 请帮助,如何在hibernate本机查询中使用?或其他替代方法。

  • 问题内容: 有没有办法使用HQL在Grails中使用hibernate命名查询? 我已经在《利用hibernate》一书中阅读了有关它们的内容,想知道是否有办法在Grails中使用它们。 像这样的映射文件中包含命名查询以及类映射: 现在,我确定可以包含一个 hibernate映射文件, 并将其集成到Grails GORM配置中,因为在此声明,包含 hibernate映射文件的 可以在Grails中

  • 我正在使用oracle 10g和hibernate 3.3.2。我以前在sql中使用过正则表达式,现在我第一次在HQL中使用它。 这是我的hql,当我在没有类似regex_的函数的情况下运行它时,它会按预期运行。但我无法用类似正则表达式的表达式执行它。 它说... 嵌套异常是org.hibernate.hql.ast.QuerySynTaxException:意外的AST节点:(靠近第1行,第66