今天在做一个项目需要做到Set集的数据过虑,因为在获取一个User的时候不能将属于这个User的Knowledge全部取出,再一个一个地筛选符合条件的Knowledge,这样做会在很大的程度降底系统性能。
在Hibernate中类型为Set、List的实体属性也是可以连接查询的,例如User里面有一个Set<Knowledge> knowledge属性要获取User中Knowledge的isShared的属性为true的User并且在返回的User中的knowledges中包含isShared为true的Knowledge对象的时候,就要通Set的过虑查询(左连接查询),在hibernate3.2.3以后的写法如下:
select distinct u from User u left join fetch u.knowledges k where k.isShare=true。
这样就只会获取knowledge的isShared为true的User,并且User里面的knowleges中包含knowledge的isShared为true的Knowlege对象。
需要注意的是:关键字distinct和fetch。要实现上面的数据过虑就得要这两个关键字。第一个关键字是独立的意思,第二个关键字是以一条sql语句执行。如果少了fetch这个关键字,则达不到目的。返回的结果是一个User包含isShared为true和false的knowledge集合。
同理,如果Knowledge里面还要Set、List属性,并且也要据根这些属性中的对象的某些属性约束查询的话(二级或三级连接查询),也是一样可以做到的。
在Hibernate中类型为Set、List的实体属性也是可以连接查询的,例如User里面有一个Set<Knowledge> knowledge属性要获取User中Knowledge的isShared的属性为true的User并且在返回的User中的knowledges中包含isShared为true的Knowledge对象的时候,就要通Set的过虑查询(左连接查询),在hibernate3.2.3以后的写法如下:
select distinct u from User u left join fetch u.knowledges k where k.isShare=true。
这样就只会获取knowledge的isShared为true的User,并且User里面的knowleges中包含knowledge的isShared为true的Knowlege对象。
需要注意的是:关键字distinct和fetch。要实现上面的数据过虑就得要这两个关键字。第一个关键字是独立的意思,第二个关键字是以一条sql语句执行。如果少了fetch这个关键字,则达不到目的。返回的结果是一个User包含isShared为true和false的knowledge集合。
同理,如果Knowledge里面还要Set、List属性,并且也要据根这些属性中的对象的某些属性约束查询的话(二级或三级连接查询),也是一样可以做到的。