`
anson_xu
  • 浏览: 502461 次
  • 性别: 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的话会造成类型和数据的顺序不一致而报错。
分享到:
评论

相关推荐

    java面试题

    答:声明式的事务管理主要是将在进行对数据库中数据的添加或者修改时需要执行事务管理,主要是为了避免在执行添加或修改的时候添加或修改不完全正确,导致数据丢失。spring使用AOP面向切面的思想进行事务管理的。 ...

    ARCH4系统开发指南

    2.3 如何执行SQL查询 12 2.4 如何使用Mail 12 2.4.1 确保资源文件正确 12 2.4.1.1 确认mail.properties文件设置正确 12 2.4.1.2 确认applicationContext-mail.xml文件设置正确 12 2.4.1.3 确认applicationContext-...

    Java面试宝典2010版

    这两行代码执行后,原始的String对象中的内容到底变了没有? 32、是否可以继承String类? 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 34、String 和StringBuffer的区别 35...

    Spring.3.x企业应用开发实战(完整版).part2

    13.6.4 Web应用程序中调度器的启动和关闭问题 13.7 小结 第14章 使用OXM进行对象XML映射 14.1 认识XML解析技术 14.1.1 什么是XML 14.1.2 XML的处理技术 14.2 XML处理利器:XStream 14.2.1 XStream概述 14.2.2 快速...

    Spring3.x企业应用开发实战(完整版) part1

    13.6.4 Web应用程序中调度器的启动和关闭问题 13.7 小结 第14章 使用OXM进行对象XML映射 14.1 认识XML解析技术 14.1.1 什么是XML 14.1.2 XML的处理技术 14.2 XML处理利器:XStream 14.2.1 XStream概述 14.2.2 快速...

    springmybatis

    查询出列表,也就是返回list, 在我们这个例子中也就是 List&lt;User&gt; , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的 ...

    最新Java面试宝典pdf版

    这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...

    Java面试笔试资料大全

    这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...

    JAVA面试宝典2010

    这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...

    Java面试宝典-经典

    这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...

    java面试题大全(2012版)

    这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...

    Java面试宝典2012版

    这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer...

    java面试宝典2012

    这两行代码执行后,原始的String对象中的内容到底变了没有? 24 32、是否可以继承String类? 25 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 25 34、String 和StringBuffer的...

    Java面试宝典2012新版

    这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...

    Java 面试宝典

    这两行代码执行后,原始的 String 对象中的 内容到底变了没有? ..................................................................................................... 23 32、是否可以继承 String 类? .........

Global site tag (gtag.js) - Google Analytics