怎样取得hsql的返回值
取多个字段,Hibernate把每个id和name做成一个2个元素的单维数组,List实际上是一个单维数组的集合。
Query q = s.createQuery("select Cat.id, Cat.name, from Cat ");;
List l = q.list();;
for (int i=0; i< l.size();; i++); {
Object[] row = (Object[]); l.get(i);;
Long id = (Long); row[0];
String name = (String); row[1];
}
在这种情况下,HQL是不会去构造PO的
get(find) 和 load的区别http://blog.csdn.net/cin_ie/archive/2009/07/13/4345475.aspx
http://blog.csdn.net/kunmingkunlun/archive/2008/03/20/2198818.aspx
简单总结
总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
之所以记下这个主题, 是今天在arm里发现一个很骇人的查询性能问题. 某处程序出错, 原因是该对象的引用对象的父对象id不存在, 于是我随随便便写了个find语句去取出对象. 举例如下
A.getB.getC.getId
在hbm里, a引用了b,b引用了c. 但因为如果不用lazy的模式,hsql会立刻找出所有的对象关系树. 恰好这几个对象都大量引用了其他对象. 最后就这个小小的操作,居然执行了将近50条sql查询语句!
经验总结:
1) 在查询多表关联的时候,尽量用jdbc. 如果一时贪方便用hsql, 那么也要用query方法而不是直接find,load. 并且做好良好的dao接口. 这样在该方法出现性能问题时,可以在dao实现里修改而不影响业务逻辑.
2) 侧面证明了把sql/hsql放在dao层的重要性. 对很简单的sql, 放在service和dao的区别不大, 但如果预见到该方法查询的数据多, 可能出现性能问题, 那么尽量将之放到dao. 当然, 这和程序员的经验有关.
hibernate 2.1连ORACLE有错,需查看SQL,可是UPDATE或INSERT中的值都被替换成“?”,如何才能显示出完整的SQL呢? 在WEB-INF/classes/log4j.properties添加如下内容:
### log just the SQL
log4j.logger.net.sf.hibernate=info
### log just the SQL
#log4j.logger.net.sf.hibernate.SQL=debug
### log JDBC bind parameters ###
log4j.logger.net.sf.hibernate.type=debug