关键字: 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>
分享到:
相关推荐
在开发和调试基于Hibernate的Java应用时,有时我们需要获取到SQL语句的完整形式,而不仅仅是Hibernate默认输出的参数化形式。在这种情况下,P6Spy是一个非常有用的工具。P6Spy是一个开源的JDBC代理库,它允许我们...
当Hibernate的映射文件中包含多个`<mapping>`元素时,需要确保每个元素对应的实体类与数据库表的结构匹配。例如,`TbManager`和`TbManagerB`可能分别对应不同的表,它们的数据绑定配置应分别准确无误,以避免在执行...
注意,参数的位置是基于它们在SQL语句中出现的顺序,从1开始计数。 ### 总结 使用问号参数化查询是编写安全、高效SQL语句的关键实践。它不仅可以防范SQL注入,还能优化性能,同时减少因字符串拼接导致的潜在错误。...
总之,在Hibernate中使用SQL语句,你可以根据实际需求灵活地执行原始的SQL查询,同时利用ORM的优势将结果转换为Java对象。这使得开发者能够在保持面向对象编程的同时,充分利用SQL的特性。无论是直接在代码中编写SQL...
原始的实现方式是直接通过Hibernate API来执行批量删除操作,例如: ```java Transaction tx = session.beginTransaction(); List<Customer> customers = session.createQuery("FROM Customer WHERE age > 0").list...
- **直接执行JDBC SQL语句**: 允许直接执行原始的JDBC SQL语句,增强了灵活性。 ##### 3.6 其他功能 - **强制使用主/从库**: 在有主从复制的环境中,可以指定SQL执行的具体数据库。 - **生成POJO代码和SQL片段**: ...
处理 Hibernate 中的 `char` 类型数据时,需要注意数据库字段与 Java 实体类之间的映射配置、查询时参数的类型一致性以及类型转换等问题。通过正确配置 Hibernate 映射文件、使用合适的 Hibernate 类型以及注意参数...
然而,正如你所描述的,Hibernate的HQL(Hibernate Query Language)并不直接支持在`FROM`子句后跟一个子查询,这与标准的SQL语法有所差异。在HQL中,子查询通常用在`WHERE`子句或者`SELECT`子句中,而不是作为数据...
直接使用JDBC执行原始SQL语句可以带来最佳的性能,因为它跳过了HQL到SQL的转换、Java对象初始化和缓存处理。但这样操作时需手动处理缓存同步,确保缓存中的对象与数据库保持一致。 三、提升数据库查询性能 1. SQL...
瞬时态的对象未与Hibernate管理,持久态的对象已被Hibernate持久化并存在于一级缓存中,而脱管态的对象曾是持久态但Session已关闭,失去了与Session的关联。 **三、检索策略与方式** Hibernate提供了多种检索数据的...
当查询一个视图时,Hibernate会生成相应的SQL语句去执行视图查询。通过阅读源码,我们可以了解到Hibernate如何处理不同类型的查询以及对视图的支持。 **总结** 总之,Hibernate视图提供了对数据库视图的封装,使得...
- **hibernate3.jar**: 这是一个Java档案文件,包含预编译的Hibernate 3类和资源,可以直接在Java应用中使用,作为依赖来执行ORM(对象关系映射)任务。 - **hibernate3-src.zip**: 这是一个ZIP文件,通常包含...
4. **双向关联**: 在两个实体之间建立关联,需要处理好关联的维护问题。 5. **投影与分页**: 查询结果可以是原始对象、投影对象或者特定的字段,同时支持分页查询。 **五、实战应用** 1. 创建实体类并进行表映射。...
开发者可以通过编程语言(如Python、Java、C#等)的数据库模块来构建和执行SQL语句,或者使用ORM(Object-Relational Mapping)工具如Hibernate、Entity Framework等,将SQL操作转化为面向对象的代码。 接着,"在...
- **查询语言**:提供了HQL(Hibernate Query Language),这是一种类似SQL的语言,用于执行数据库查询操作。 #### 5. 创建Hibernate Demo项目 - **步骤详解**: 1. **创建Java项目**:首先,在MyEclipse中创建...
SQL注入攻击是网络安全领域中一个严重的问题,它发生在应用程序未能充分验证或清理用户输入的数据时。当恶意用户通过输入特定的SQL代码,使得数据库执行非预期的操作,就可能发生SQL注入。这种攻击可能导致数据泄露...
在执行分页查询时,`setFirstResult`和`setMaxResults`方法会添加到生成的SQL中,对应LIMIT和OFFSET子句。 4. **性能优化** 为了提高效率,可以使用缓存技术,如二级缓存,来存储已经计算过的总数,避免重复执行...
要使用 Envers,首先需要在 Hibernate 的配置文件或应用的启动代码中进行设置。主要的配置选项包括: - `hibernate.envers.audit_table_suffix`:指定审计表的后缀,默认为 `_AUD`。 - `hibernate.envers.default_...
在IT行业中,Spring.NET和Hibernate是两个非常重要的框架,它们分别专注于依赖注入(DI)和对象关系映射(ORM)。Spring.NET是.NET平台上的企业级应用框架,它提供了丰富的功能,包括DI、AOP(面向切面编程)、事务...
设置为`true`时,Hibernate会在SQL中添加调试帮助性的注释。 **JDBC 和 连接(connection)属性:** **13. hibernate.jdbc.fetch_size** 设置非零值以指定JDBC查询的抓取大小,提高数据读取效率。 **14. hibernate....