论坛首页 Java企业应用论坛

出错 为什么这句HQL在ORACLE 8I 运行后,数据库服务器不能再访问

浏览 3399 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-01-12  
Product 主键id long类型,外键type long类型
Type 主键id long类型,name String类型 
Type 与 Product 是一对多关系
现在本人现在要用Type的name来查出有多少个Product(这只是一个最简单的示例,有一些是多个表关联查询的)
HQL:
SELECT COUNT(*) FROM Product p JOIN p.type WHERE p.type.name=:name

在oracle 8I(database Server)的CPU占用率竟然是98%~100%,而造成了oracle不能再访问,不过这个语句如果是在SQL Server的话就不会出现问题。
Hibrenate 生成的SQL语句是(假设表名和PO的类名一样):
SELECT COUNT(*) FROM Prodcut p,Type t WHERE p.type=t.id AND t.name=? AND p.type=t.id
其实这个SQL语句一看就写得有点不对劲,为什么要多写一对  p.type=t.id ,不知道各位高手有没有遇到过这种问题呢??


/==============以下这个问题并不是太重要,只是顺便而已=======/
还有就是关于用TheadLocal来管理Session 的 问题(是在一个Servlet来初始化这个SessionFactory的,没有采用Filter)
如下
Public class A{
       void m1(){
         // 获得Session
         //操作
      //关闭Session
      }
      void m2(){
        //获得Session
        //调用m1()
        //操作  /*这里就是出错的地方,在这里Session已经被关闭,因为已经在m1里关闭了
     //关闭Session 
      }
}

不知道各位各手有什么好办法呢??还是我对TheadLocal不是很了解(我的确不是用TheadLocal来管理的, 因为我们调试时很麻烦,不一定是web,我是用动态代理来进行管理分配Session,即在我的DAO里是不用获得Session,我的工厂会自动分配Session给DAO,其实最好还觉得用AOP来管理这些代码,我想有时间就会把我的那个动态代理的改成AOP,也说明一点吧,我的DAO也只是把一些常用的封装了一下,复杂的查询我是让我的Query来进行管理).
好久没有上来了(其实也经常上,只是没有登录,呵呵,因为自己的水平好低,所以也帮不上别人什么忙),快要过年了,祝大家工作顺利.
   发表时间:2004-01-12  
SELECT count(*) FROM Product p where p.type.id=?
0 请登录后投票
   发表时间:2004-01-12  

SELECT count(*) FROM Product p join p.type type where type.id=?

还是用前一个快。
0 请登录后投票
   发表时间:2004-01-13  
yehs220 真是一个很热心的人,谢谢你
能不能说明点为什么那样就会出错呢,再说我可能也会有多个关联对象进行查询的呀,上面只是一个简单的例子而罢了。
况且在SQL server就没有出错。可能是Oracle 8i的Bug吧.
谢谢你回复,我会去试你所说的解方法的。
0 请登录后投票
   发表时间:2004-01-13  
引用

SELECT COUNT(*) FROM Product p JOIN p.type WHERE p.type.name=:name

Hibrenate 生成的SQL语句是(假设表名和PO的类名一样):
SELECT COUNT(*) FROM Prodcut p,Type t WHERE p.type=t.id AND t.name=? AND p.type=t.id
其实这个SQL语句一看就写得有点不对劲,为什么要多写一对 p.type=t.id ,不知道各位高手有没有遇到过这种问题呢??

可能是因为你没有为p.type定义别名吧。

我没看清你是要根据name来查询,我写的前两个查询稍微改改
SELECT count(*); FROM Product p where p.type.name=?
或
SELECT count(*); FROM Product p join p.type type where type.name=? 

这两个应该是一样的,前一个更简洁一些
0 请登录后投票
   发表时间:2004-01-19  
谢谢大家的回复。
其实如果我是可以那样子做的话就好了(楼上说的那样子),因为我是要根椐一条语句(HQL)查询出指定数目(分页)的记录后,又要拼出一条HQL来查出总数,因为有时候多表查询是要用join的,特别有时为了性能要用 join fetch这种语句一次性把需要的查询出来(因为谁都不想多次查询数据库吧,从性能上来讲),不知道还有什么好的方法呢???谢谢了,新年快乐?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics