Hibernate的检索方式

无意间看到的一篇文章,是有关hibernate的检索方式的
感觉很有用处,
下面是链接:
[url]http://aumy2008.blogbus.com/logs/13835265.html[/url]
虽然还是有点不大懂,但是以后我会在此基础上进行一些稍微的补充的


关于setFetchMode:
FetchMode是让两个表建立连接,仅此而已。
例如:一个Emp只能属于一个dept,而一个dept中可以有好多Emp,
这时在Emp中就有一个dept对象
public class Emp{

.......
private dept d;
get()方法
set()方法
......
}
那么如果我想取出emp的时候顺便把它的dept相关的东西给取出来,此时我就需要setFetchMode("dept",FetchMode.JOIN),这样,我就可以正好把相关的dept里面的数据也取出来了,如果打印数据库执行语句,此时是生成的左连接,
但是注意:setFetchMode:仅仅能取出dept的数据,setFetchMode不能完成查询功能。如果查询条件里面有dept里面的东西,那setFetchMode就完不成相应的查询,如果想完成查询,你就需要用createAlias了

关于CreateAlias:
主要是用于查询的时候建立别名,所谓的"别名",自己认为就是另外起了一个名字,但是也不是这么简单。例如,我想查询所有dept的deptName是"人力资源部"的emp
那么我就应该用c.createAlias("dept","dept").add(Restrictions.eq("dept.deptName","人力资源部"));
这里就能完成上面的查询,其实createAlias也是做的left join

那么,也就是说:
setFetchMode可以建立两个表之间的连接,他建立连接的主要目的是为了取出相应的数据,
但是不能只用setFetchMode进行查询。例如,我们有:
c.setFetchMode("dept",FetchMode.JOIN);
c.add(Restrictions.eq("dept.deptName","人力资源部"));
如果只是这两句话的话,肯定有错误的。

而createAlias主要是用于查询,建立两表之间的关系,查询与两个表相关的数据。


那么上面的查询这样写就可以了:
c.setFetchMode("dept",FetchMode.JOIN);
c.createAlias("dept","dept").add(Restrictions.eq("dept.deptName","人力资源部"));
这样就可以既找出dept为“人力资源部”的人,又把与他相关的员工给找出来了。

缺点:setFetchMode和createAlias都会让数据库中的表与其他的表join起来,那么肯定查询的效率就低了。
还有,程序在查询的时候到底是外连接还是内连接我认为还是与你xml里面的配置是有关的。例如:你在emp的xml里面配置与dept之间的关系是多对一关系,并且在数据库里面配置了外键关联,那么无论你setFetchMode设置为什么,这里emp与dept进行关联的时候都会是inner join。绝对不会是外连接,这样写的原因我认为应该是与外键的关联有关吧,由于外键的关系,emp的dept必须在dept中,所以才会使用内连接
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值