Hibernate的hql使用和Hibernate报错汇总

向右看齐 2022-08-07 13:50 346阅读 0赞

最近做个简单的登录demo,发现总是报错,如下:

  1. org.hibernate.exception.SQLGrammarException: could not execute query
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.loader.Loader.doList(Loader.java:2235)

原因是调用了sessionFactory.getCurrentSession().createSQLQuery(hql); 因为入参是hql语句,而不是原生的sql语句。

另外:

hibernate 中createQuery与createSQLQuery两者区别是:
前者用的hql语句进行查询,后者可以用sql语句查询
前者以hibernate生成的Bean为对象装入list返回
后者则是以对象数组进行存储
所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便
突然发现createSQLQuery有这样一个方法可以直接转换对象
Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);
XXXXXXX 代表以hibernate生成的Bean的对象,也就是数据表映射出的Bean。

  1. java.lang.IllegalArgumentException: Parameter username does not exist as a named parameter in [from User u where u.username=?]
    at org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:380)
    at org.hibernate.impl.AbstractQueryImpl.setInteger(AbstractQueryImpl.java:632)
  1. 原因:
  2. 调用代码:
  3. String hql="from User u where u.username=?";
  4. try
  5. {
  6. Query query=sessionFactory.getCurrentSession().createQuery(hql);
  7. query.setInteger("username", Integer.parseInt(username));
  8. List list=query.list();
  9. 因为query.setInteger的参数username虽然在数据库列有存在,但在hql语句里,username没设定,修改如下:
  10. <pre name="code" class="java">String hql="from User u where u.username=:<strong>uname</strong>";
  11. try
  12. {
  13. Query query=sessionFactory.getCurrentSession().createQuery(hql);
  14. query.setInteger("<strong>uname</strong>", Integer.parseInt(username));
  15. List list=query.list();

问题解决。

未完….

发表评论

表情:
评论列表 (有 0 条评论,346人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Hibernate HQL

    Hibernate HQL查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage...