Hibernate 初学者的一点小问题

kong_resty 发布于 2012/05/04 15:02
阅读 245
收藏 0

@Test
 public void testHql4(){
  Session session = HibernateSessionFactory.getSession();
  Query query =session.createQuery("FROM Emp e WHERE e.dept.name =?");
  query.setParameter(0,"dept2");
  List<Emp> emps = query.list();
  for(Emp emp : emps)
  {
   System.out.println(emp.getName()+","+emp.getDept().getName());
  }
  session.close();
 }

运行结果没问题。但是我打印该底层sql访问语句就有点想不通了:

    Hibernate:
    select
        emp0_.id as id1_,
        emp0_.name as name1_,
        emp0_.dept_id as dept3_1_
    from
        t_emp emp0_,
        t_dept dept1_
    where
        emp0_.dept_id=dept1_.id
        and dept1_.name=?
Hibernate:
    select
        dept0_.id as id0_0_,
        dept0_.name as name0_0_,
        dept0_.loc as loc0_0_
    from
        t_dept dept0_
    where
        dept0_.id=?

明明上面一句就可以得出结果的 为什么还要执行第二句sql语句啊

请帮忙分析分析哦 不胜感激

 

 

加载中
0
魔力猫
魔力猫

你第一句只是取出了emp表的数据。而你又去获取dept表的数据。当然会有第二条语句了。

如果没有专门设置的话,Hibernate只会获取对象表的数据,对象关联的记录只取id,需要的时候再去拿。

0
jeffsui
jeffsui

emp.getName()+","+emp.getDept().getName() 

好好看看这句。

0
kong_resty
kong_resty

引用来自“jeffsui”的答案

emp.getName()+","+emp.getDept().getName() 

好好看看这句。

怎么理解 新手啊 接下吧

0
kong_resty
kong_resty

引用来自“章彦儿”的答案

引用来自“jeffsui”的答案

emp.getName()+","+emp.getDept().getName() 

好好看看这句。

怎么理解 新手啊 接下吧

解释下
0
jeffsui
jeffsui

首先发出一条查询对象id列表的sql;

其次根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句

这就是N+1条sql语句问题.

0
JFinal
JFinal
现在都是ActiveRecord时代了,还在hibernate呢?
0
kong_resty
kong_resty

引用来自“JFinal”的答案

现在都是ActiveRecord时代了,还在hibernate呢?

这个技术没听说过啊  看来是落后了 哈哈

0
JFinal
JFinal

引用来自“章彦儿”的答案

引用来自“JFinal”的答案

现在都是ActiveRecord时代了,还在hibernate呢?

这个技术没听说过啊  看来是落后了 哈哈

去看看这个就知道了: http://my.oschina.net/jfinal/blog/49738
0
白黑白
白黑白
emp.getDept().getName()
返回顶部
顶部