join 查询的时候,是用一条语句查处所有记录,包括关联表记录,select查出的是N+1条记录,两个都是差不多的,但是如果用了lazy=true,延迟加载的话,select在查询时只会查出主表记录,也就是1,如果其他地方也用到了数据,此时就会自动在执行查询,查出N,可以降低内存消耗 .还有,hibernate是的session是轻量级的,创建和销毁都不花很多资源,查询数据也很快,这里fetch主要起这个作用,所以我们一般的情况下要用select查询
在配置中使用fetch=“join” ,Hibernate将在同一个select中返回关联子对象或集合,能够利用Oracle 或 Sybase类型outer joins能够提高性能
fetch=“select” ,这表示Hibernate将在第二个SELECT中获取关联方实体或集合,除非你显式地实现lazy fetching (lazy=“false”)。
简单说:join是一条SQL完成, select是分两次SQL完成.
给你举一下fetch和lazy结合使用的情况。
1、当lazy="true" fetch = "select" 的时候 , 这个时候是使用了延迟策略,开始只查询出一端实体,多端的不会查询,只有当用到的时候才会发出sql语句去查询 ;
2、当lazy="false" fetch = "select" 的时候 , 这个时候是使没有用延迟策略,同时查询出一端和多端,同时产生1+n条sql.
3、当lazy="true"/lazy="false" fetch = "join"的时候,这个时候延迟已经没有什么用了,因为采用的是外连接查询,同时把一端和多端都查询出来了,延迟没有起作用。