基于hibernate的das实现研究(2)

最近做SDO的 DAS实现,用到了Hibernate的scrollableResult功能,记录下code分析结果,备用:

1)分页功能

Query q = session.createQuery("from Cat as c");
     q.setFirstResult(200);
     q.setMaxResults(100);
     List l = q.list();

分页和ScrollableResult是没有任何关系的,完全在API中体现。org.hbiernate.loader.Loader的第1543行如下:

if ( useLimit ) {
   sql = dialect.getLimitString(
     sql.trim(), //use of trim() here is ugly?
     useOffset ? getFirstRow(selection) : 0,
     getMaxOrLimit(selection, dialect)
    );
  }

也就是用不同的dialect来做分页。这个是很正常的考虑。难得的是hibenrate对不同数据库的 max值的设置也区别开了: 比如某种数据库的 maxResults表示 最多取多少条记录;而另外的数据库可能表示 最大的记录号。

2)ScrollableResult

在JDBC2.0中是这样定义的:

Statement stmt=con.getStatement("游标类型", "记录更新权限");
游标类型:
ResultSet.TYPE_FORWORD_ONLY:只可以向前移动
ResultSet.TYPE_SCROLL_INSENSITIVE:可卷动。但是不受其他用户对数据库更改的影响。
ResultSet.TYPE_SCROLL_SENSITIVE:可卷动。当其他用户更改数据库时这个记录也会改变。
记录更新权限:
ResultSet.CONCUR_READ_ONLY,只读
ResultSet.CONCUR_UPDATABLE,可更新

对于ScrollMode,hibernate默认使用ResultSet.TYPE_SCROLL_INSENSITIVE。当然你可以在API中指定你自己

想要的mode。

对于update priv,hibernate使用ResultSet.CONCUR_READ_ONLY,只读方式。

如果你使用的外部connection,必须在cfg.xml中指定
        <property name="hibernate.jdbc.use_scrollable_resultset">true</property>

当然,不用外部connection的情况下,这个配置与否是没有关系的。

 

你可能感兴趣的:(sql,c,Hibernate,xml,jdbc)