关键字: sql
在hibernate执行标准的sql,一开始写了如下的代码:
java 代码
-
public List querySQL(final String sql) {
-
HibernateTemplate ht = getHibernateTemplate();
-
return (List) ht.execute(new HibernateCallback() {
-
public Object doInHibernate(Session session) throws HibernateException {
-
try {
-
SQLQuery query = session.createSQLQuery(sql);
-
return query.list();
-
} catch (RuntimeException e) {
-
log.error("query sql catch exception: " , e);
-
throw e;
-
}
-
}
-
});
-
}
执行一般的查询还没有问题,但是对于某些复杂的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 代码
-
[appfuse] ERROR [main] LookupDaoHibernate.doInHibernate(56) | query sql catch exception:
-
org.hibernate.exception.SQLGrammarException: could not execute query
-
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
-
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
-
。。。
-
-
Caused by: java.sql.SQLException: Column 'inetip' not found.
-
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
-
at com.mysql.jdbc.ResultSet.findColumn(ResultSet.java:955)
-
at com.mysql.jdbc.ResultSet.getString(ResultSet.java:5447)
很是奇怪的报错!查看了它的文档,也没有看到有啥特别的说明。最后通过试验发现对于复杂的对象类型,必须用addScalar说明数据的类型,才能正常工作。修改后的代码如下:
-
public List querySQL(final String sql, final Map<String,Type> paramMap) {
-
HibernateTemplate ht = getHibernateTemplate();
-
return (List) ht.execute(new HibernateCallback() {
-
public Object doInHibernate(Session session) throws HibernateException {
-
try {
-
SQLQuery query = session.createSQLQuery(sql);
-
Set entrySet=paramMap.entrySet();
-
for (Iterator it=entrySet.iterator();it.hasNext();) {
-
Entry entry=(Entry)it.next();
-
query=query.addScalar((String)entry.getKey(),(Type)entry.getValue());
-
}
-
return query.list();
-
} catch (RuntimeException e) {
-
log.error("query sql catch exception: " , e);
-
throw e;
-
}
-
}
-
});
-
}
外部调用的时候,要传递数据的类型:
java 代码
-
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";
-
-
Map paramMap=new HashMap();
-
paramMap.put("item1", Hibernate.STRING);
-
paramMap.put("item2",Hibernate.INTEGER);
-
-
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>
分享到:
相关推荐
答:声明式的事务管理主要是将在进行对数据库中数据的添加或者修改时需要执行事务管理,主要是为了避免在执行添加或修改的时候添加或修改不完全正确,导致数据丢失。spring使用AOP面向切面的思想进行事务管理的。 ...
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-...
这两行代码执行后,原始的String对象中的内容到底变了没有? 32、是否可以继承String类? 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 34、String 和StringBuffer的区别 35...
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 快速...
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 快速...
查询出列表,也就是返回list, 在我们这个例子中也就是 List<User> , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的 ...
这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...
这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...
这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...
这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...
这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...
这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer...
这两行代码执行后,原始的String对象中的内容到底变了没有? 24 32、是否可以继承String类? 25 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 25 34、String 和StringBuffer的...
这两行代码执行后,原始的String对象中的内容到底变了没有? 22 32、是否可以继承String类? 23 33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的...
这两行代码执行后,原始的 String 对象中的 内容到底变了没有? ..................................................................................................... 23 32、是否可以继承 String 类? .........