最近我和一朋友讨论如何在在spring+hibernate框架下设计通用的查询程序。设计通用的查询程序,对于单表查询比较容易,只要把要查询的值对象和查询条件作为条件传递给后台就可以执行查询了。而从结果集中取值也比较容易,因为结果集就是这个值对象的集合。但要是设计一个通用的多表查询程序就比较复杂了,涉及多个值对象、值对象的关联、查询条件的前缀、取值等等问题。我提出一个观点,现在的hibernate可以不需要多表查询,运用单表查询以及值对象的各种关系就可以完全实现所有多表查询的功能。
为什么这么说呢?比如我们需要获得一个部门及其下面的所有员工。过去我们需要将部门和员工这2个表进行关联进行多表查询,但现在我们只需要在设计部门值对象的时候为其增加一个一对多关联,然后通过单表查询部门表,在每个部门值对象的员工属性中就有其所有的员工了。再比如,如果我们需要在查询员工的时候显示各个员工所在部门的部门名称,现在我们也同样不需要多表查询了。只需要在员工值对象中建立员工到部门的多对一关系,在单表查询员工的时候,每个员工值对象中都有部门属性,对应的是部门值对象,包含了其所在部门的全部信息。
以上提供了运用单表查询以及值对象的各种关系替代多表查询最常见的2种情况,而hibernate还提供了一对一、多对多、3种继承关系,我认为可以含盖几乎所有需要使用多表查询的应用。所以我认为,hibernate发展到现在,我们可以几乎不需要使用多表查询。编写一个通用的单表查询程序就可以应付大多数使用hibernate的查询程序,除了复杂查询。hibernate不适用于复杂查询,不论是易用性、效率来看都不适合。