`
anson_xu
  • 浏览: 514684 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

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

阅读更多

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

关键字: 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);  

修改以后就不会有问题啦

<script type="text/javascript"></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
评论
1 楼 fishyych 2007-10-10   引用
上面的东西搞错了一点,就是参数的传递应当使用list,如果使用map的话会造成类型和数据的顺序不一致而报错。
分享到:
评论

相关推荐

    采用p6spy完整显示hibernate的SQL语句

    在开发和调试基于Hibernate的Java应用时,有时我们需要获取到SQL语句的完整形式,而不仅仅是Hibernate默认输出的参数化形式。在这种情况下,P6Spy是一个非常有用的工具。P6Spy是一个开源的JDBC代理库,它允许我们...

    Hibernate和struts中遇到的问题.doc

    当Hibernate的映射文件中包含多个`&lt;mapping&gt;`元素时,需要确保每个元素对应的实体类与数据库表的结构匹配。例如,`TbManager`和`TbManagerB`可能分别对应不同的表,它们的数据绑定配置应分别准确无误,以避免在执行...

    sql语句中用问号代替参数

    注意,参数的位置是基于它们在SQL语句中出现的顺序,从1开始计数。 ### 总结 使用问号参数化查询是编写安全、高效SQL语句的关键实践。它不仅可以防范SQL注入,还能优化性能,同时减少因字符串拼接导致的潜在错误。...

    在Java的Hibernate框架中使用SQL语句的简单介绍

    总之,在Hibernate中使用SQL语句,你可以根据实际需求灵活地执行原始的SQL查询,同时利用ORM的优势将结果转换为Java对象。这使得开发者能够在保持面向对象编程的同时,充分利用SQL的特性。无论是直接在代码中编写SQL...

    hibernate批量删除

    原始的实现方式是直接通过Hibernate API来执行批量删除操作,例如: ```java Transaction tx = session.beginTransaction(); List&lt;Customer&gt; customers = session.createQuery("FROM Customer WHERE age &gt; 0").list...

    BeetlSQL 2.10中文文档

    - **直接执行JDBC SQL语句**: 允许直接执行原始的JDBC SQL语句,增强了灵活性。 ##### 3.6 其他功能 - **强制使用主/从库**: 在有主从复制的环境中,可以指定SQL执行的具体数据库。 - **生成POJO代码和SQL片段**: ...

    Hibernate的char问题.txt

    处理 Hibernate 中的 `char` 类型数据时,需要注意数据库字段与 Java 实体类之间的映射配置、查询时参数的类型一致性以及类型转换等问题。通过正确配置 Hibernate 映射文件、使用合适的 Hibernate 类型以及注意参数...

    hibernate子查询

    然而,正如你所描述的,Hibernate的HQL(Hibernate Query Language)并不直接支持在`FROM`子句后跟一个子查询,这与标准的SQL语法有所差异。在HQL中,子查询通常用在`WHERE`子句或者`SELECT`子句中,而不是作为数据...

    Hibernate优化方案

    直接使用JDBC执行原始SQL语句可以带来最佳的性能,因为它跳过了HQL到SQL的转换、Java对象初始化和缓存处理。但这样操作时需手动处理缓存同步,确保缓存中的对象与数据库保持一致。 三、提升数据库查询性能 1. SQL...

    hibernate教程hibernate教程

    瞬时态的对象未与Hibernate管理,持久态的对象已被Hibernate持久化并存在于一级缓存中,而脱管态的对象曾是持久态但Session已关闭,失去了与Session的关联。 **三、检索策略与方式** Hibernate提供了多种检索数据的...

    hibernate 视图

    当查询一个视图时,Hibernate会生成相应的SQL语句去执行视图查询。通过阅读源码,我们可以了解到Hibernate如何处理不同类型的查询以及对视图的支持。 **总结** 总之,Hibernate视图提供了对数据库视图的封装,使得...

    hibernate3.jar及其源代码文件

    - **hibernate3.jar**: 这是一个Java档案文件,包含预编译的Hibernate 3类和资源,可以直接在Java应用中使用,作为依赖来执行ORM(对象关系映射)任务。 - **hibernate3-src.zip**: 这是一个ZIP文件,通常包含...

    hibernate API 中文(附带教程)

    4. **双向关联**: 在两个实体之间建立关联,需要处理好关联的维护问题。 5. **投影与分页**: 查询结果可以是原始对象、投影对象或者特定的字段,同时支持分页查询。 **五、实战应用** 1. 创建实体类并进行表映射。...

    自动查找数据源,自动根据SQL语句,在表格中显示 <img src="/ima

    开发者可以通过编程语言(如Python、Java、C#等)的数据库模块来构建和执行SQL语句,或者使用ORM(Object-Relational Mapping)工具如Hibernate、Entity Framework等,将SQL操作转化为面向对象的代码。 接着,"在...

    MyEclipse Hibernate 快速入门 中文版(PDF)

    - **查询语言**:提供了HQL(Hibernate Query Language),这是一种类似SQL的语言,用于执行数据库查询操作。 #### 5. 创建Hibernate Demo项目 - **步骤详解**: 1. **创建Java项目**:首先,在MyEclipse中创建...

    sql注入攻击防范解析

    SQL注入攻击是网络安全领域中一个严重的问题,它发生在应用程序未能充分验证或清理用户输入的数据时。当恶意用户通过输入特定的SQL代码,使得数据库执行非预期的操作,就可能发生SQL注入。这种攻击可能导致数据泄露...

    Hibernate通用分页.docx

    在执行分页查询时,`setFirstResult`和`setMaxResults`方法会添加到生成的SQL中,对应LIMIT和OFFSET子句。 4. **性能优化** 为了提高效率,可以使用缓存技术,如二级缓存,来存储已经计算过的总数,避免重复执行...

    envers hibernate

    要使用 Envers,首先需要在 Hibernate 的配置文件或应用的启动代码中进行设置。主要的配置选项包括: - `hibernate.envers.audit_table_suffix`:指定审计表的后缀,默认为 `_AUD`。 - `hibernate.envers.default_...

    Spring.net+hibernate实例

    在IT行业中,Spring.NET和Hibernate是两个非常重要的框架,它们分别专注于依赖注入(DI)和对象关系映射(ORM)。Spring.NET是.NET平台上的企业级应用框架,它提供了丰富的功能,包括DI、AOP(面向切面编程)、事务...

    hibernate 详细配置

    设置为`true`时,Hibernate会在SQL中添加调试帮助性的注释。 **JDBC 和 连接(connection)属性:** **13. hibernate.jdbc.fetch_size** 设置非零值以指定JDBC查询的抓取大小,提高数据读取效率。 **14. hibernate....

Global site tag (gtag.js) - Google Analytics