`

hibernate中执行标准sql需要注意的问题

阅读更多
在hibernate执行标准的sql,一开始写了如下的代码:
java 代码
  1. public List querySQL(final String sql) {   
  2.     HibernateTemplate ht = getHibernateTemplate();   
  3.     return (List) ht.execute(new HibernateCallback() {   
  4.             public Object doInHibernate(Session session) throws HibernateException {   
  5.                    try {   
  6.                        SQLQuery query = session.createSQLQuery(sql);   
  7.                        return query.list();   
  8.                    } catch (RuntimeException e) {   
  9.                        log.error("query sql catch exception: " , e);   
  10.                        throw e;   
  11.                    }   
  12.             }   
  13.         });   
  14. }   

执行一般的查询还没有问题,但是对于某些复杂的sql语句,比如如下这句:

        sql="select fact.inetip as item1,count(distinct(fact.mac)) as item2 from report_fact_t fact where " +
        "not exists (select * from netbar_outsideips_t ips where fact.inetip=ips.ip) " +
        "and terminallog_time=str_to_date('2007-09-04','%Y-%m-%d') group by inetip";
就会报出如下的异常:

java 代码
  1. [appfuse] ERROR [main] LookupDaoHibernate.doInHibernate(56) | query sql catch exception:    
  2. org.hibernate.exception.SQLGrammarException: could not execute query   
  3.     at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)   
  4.     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)   
  5. 。。。   
  6.   
  7. Caused by: java.sql.SQLException: Column 'inetip' not found.   
  8.     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)   
  9.     at com.mysql.jdbc.ResultSet.findColumn(ResultSet.java:955)   
  10.     at com.mysql.jdbc.ResultSet.getString(ResultSet.java:5447)  

很是奇怪的报错!查看了它的文档,也没有看到有啥特别的说明。最后通过试验发现对于复杂的对象类型,必须用addScalar说明数据的类型,才能正常工作。修改后的代码如下:

 

  1. public List querySQL(final String sql, final Map<String,Type> paramMap) {   
  2.     HibernateTemplate ht = getHibernateTemplate();   
  3.     return (List) ht.execute(new HibernateCallback() {   
  4.             public Object doInHibernate(Session session) throws HibernateException {   
  5.                    try {   
  6.                        SQLQuery query = session.createSQLQuery(sql);   
  7.                        Set entrySet=paramMap.entrySet();   
  8.                        for (Iterator it=entrySet.iterator();it.hasNext();) {   
  9.                            Entry entry=(Entry)it.next();   
  10.                            query=query.addScalar((String)entry.getKey(),(Type)entry.getValue());   
  11.                        }   
  12.                        return query.list();   
  13.                    } catch (RuntimeException e) {   
  14.                        log.error("query sql catch exception: " , e);   
  15.                        throw e;   
  16.                    }   
  17.             }   
  18.         });   
  19. }  

外部调用的时候,要传递数据的类型:

java 代码
  1.    sql="select fact.inetip as item1,count(distinct(fact.mac)) as item2 from report_fact_t fact where " +   
  2.    "not exists (select * from netbar_outsideips_t ips where fact.inetip=ips.ip) " +   
  3.    "and terminallog_time=str_to_date('2007-09-04','%Y-%m-%d') group by inetip";   
  4.   
  5.    Map paramMap=new HashMap();   
  6.    paramMap.put("item1", Hibernate.STRING);   
  7.    paramMap.put("item2",Hibernate.INTEGER);   
  8.   
  9. List results = dao.querySQL(sql,paramMap);  

修改以后就不会有问题啦

分享到:
评论
2 楼 hanqunfeng 2011-03-23  
很好,学习了
1 楼 fishyych 2007-10-10  
上面的东西搞错了一点,就是参数的传递应当使用list,如果使用map的话会造成类型和数据的顺序不一致而报错。

相关推荐

    Hibernate_NSQL&HQL增删改操作

    而NSQL则遵循标准SQL语法。 2. **类型安全**:HQL支持类型安全的参数绑定,而NSQL则需要显式指定参数类型。 3. **可移植性**:HQL由于其面向对象的特点,在不同的数据库之间具有更好的可移植性;而NSQL可能会依赖于...

    Eclipse中Hibernate简单配置和使用

    Eclipse中Hibernate简单配置和使用 Eclipse中配置和使用Hibernate框架是Java开发中常见的数据库持久化解决方案。...但需要注意的是,Hibernate的配置和使用需要遵循一定的步骤和规范,以避免出现问题。

    配置hibernate数据源

    在整个过程中,还需要注意Hibernate的版本兼容性问题,以及在配置文件中可能出现的字符编码问题。Hibernate本身提供了丰富的配置选项,使得开发人员可以根据具体需要调整框架的行为。例如,通过设置hibernate.show_...

    hibernate连接mssql server需要的jar包

    在实际应用中,为了使用Hibernate连接到SQL Server,开发者首先需要将这三个JAR文件添加到项目的类路径中。这通常可以通过以下步骤完成: 1. 将这些JAR文件复制到项目的`lib`目录。 2. 如果使用Maven或Gradle,可以...

    Hibernate驱动包

    然而,也需要注意到,过度依赖ORM可能导致性能问题,因此在设计大规模应用时,需要合理使用ORM并结合原生SQL进行优化。 总之,这个“Hibernate驱动包”是Java开发中的重要工具,为开发者提供了强大的数据库操作支持...

    jdbc_Hibernate总结

    JDBC(Java Database Connectivity)是Java程序连接数据库的标准方式,其基本步骤包括实例化驱动、注册驱动、获取连接、创建Statement、执行SQL命令以及关闭资源。在实例化驱动时,通常有三种方法:通过...

    Android应用源码Hibernate4Android.zip

    4. 持久化操作:通过Session对象,开发者可以执行增删改查操作,Hibernate会自动处理SQL的生成和执行。 四、实际应用 在Android项目中,使用Hibernate4Android可以简化数据库操作,提高开发效率。例如,创建一个新...

    Hibernate5.2.8提取包

    Hibernate是Java领域中一款广泛应用的关系型数据库对象映射框架,它简化了开发人员与数据库之间的交互,使得在Java应用程序中操作数据库变得更加简单。这个“Hibernate5.2.8提取包”包含了该版本的所有核心组件和...

    Hibernate中使用Access

    需要注意的是,尽管Access在学习阶段非常方便,但它不适合大型、高性能的Web应用程序,因为它没有分布式事务支持,并且性能上不如其他企业级数据库系统如MySQL、Oracle或SQL Server。然而,了解如何在Hibernate中...

    hibernate延迟加载解决

    具体来说,Hibernate会生成并执行一条SQL语句来获取所有与User关联的Address对象,并将它们填充到一个自定义的集合对象中。这里需要注意的是,Hibernate提供的自定义集合类(如`net.sf.hibernate.collection.Set`)...

    hibernate源码release-4.1.4.Final版

    通过深入学习Hibernate 4.1.4.Final的源码,我们可以更好地理解其设计思想,提升我们的编程技巧,同时也能为日常开发中遇到的问题提供解决方案。这是一份宝贵的资源,无论是对于初学者还是经验丰富的开发者,都值得...

    Hibernate4.1.0 实例

    **标题:“Hibernate4.1.0 实例”** 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者用面向对象的方式来处理...实践中,还需要注意异常处理、事务边界以及性能调优等方面的问题。

    Hibernate连接ACCESS

    这些库通常不在Struts2的标准依赖中,所以需要手动添加到项目的类路径中。 在实际操作中,我们需要完成以下步骤: 1. **配置Hibernate**:创建hibernate.cfg.xml文件,这是Hibernate的配置文件,其中包含了数据库...

    hibernate的查询方式介绍和hibernate的批处理和连接池配置hibernate

    - 注意:在 Hibernate 中,不能直接写成 `s.banjiId = b.banjiId`,而应该用 `s.banji.banjiId = b.banjiId` 来确保正确的关联。 - **执行 HQL** - 可以通过 `Session.createQuery` 创建 `Query` 对象,然后调用 ...

    搭建hibernate所使用的jar包,内含mysql的jdbc的jar包

    **标题与描述解析** 标题提到的是“搭建hibernate所使用的jar包,内含mysql的jdbc的jar包”,这...不过需要注意,由于这是较早的版本,可能不兼容现代Java和数据库特性,对于新项目建议使用最新稳定版本的Hibernate。

    SQL编辑器

    使用SQL编辑器时,要注意不同数据库系统之间的SQL语法差异,以及在转换过程中可能遇到的数据类型映射问题。例如,SQL中的DATE类型可能需要转换为C#或JAVA中的特定日期时间类。此外,还要考虑事务管理和错误处理,...

    SQL Parser

    同时,不同的SQLParser可能支持不同版本的SQL标准和数据库方言,选择时需注意兼容性问题。 7. **开源社区** SQLParser有多个开源实现,如Java的JSqlParser、Python的sqlparse等,它们都有活跃的社区维护,提供了...

    Hibernate连接Mycat例子详解.zip

    在实际项目中,还需要考虑错误处理、性能优化、数据一致性等问题,确保系统的稳定和可靠。 总之,`Hibernate连接Mycat例子详解.zip`提供的资源是一个很好的学习材料,它涵盖了从Mycat的配置、数据分片,到Hibernate...

    Hibernate所需jar包下载

    在实际开发中,还需要注意配置Hibernate的主配置文件(hibernate.cfg.xml),其中包含了数据库连接信息、实体类扫描路径、缓存设置等。此外,每个实体类通常需要配合一个对应的.hbm.xml映射文件,或者使用注解方式...

    Hibernate JPA

    - **兼容性**:需要注意不同版本间的兼容性问题,避免因版本不匹配导致的问题。 - **配置**:通过`persistence.xml`文件进行配置,指定数据库连接信息、映射关系等参数。例如: ```xml &lt;provider&gt;org....

Global site tag (gtag.js) - Google Analytics