使用Hibernate进行涉及两个表的查询

时间:2010-02-09 00:10:55

标签: java hibernate orm

我对sql缺乏经验,所以在我确切知道问题是什么之前,使用Hibernate就像寻找答案一样。请随时纠正我的任何误解。我正在进行一个必须使用Hibernate的项目。我所做的大部分工作都非常基础,我可以复制和修改。

现在我想做一些与众不同的事情,我不确定配置和语法是如何结合在一起的。假设我有两张桌子。

表A有两个(相关的)列,用户GUID和管理员GUID。显然,管理员可以拥有多个用户,因此对经理的查询可以返回多行。此外,管理员可以在多个项目上管理同一个用户,因此可以为同一个管理员查询多次返回相同的用户。

表B有两列,用户GUID和用户全名。那里的一对一映射。

我想对表A中的管理器GUID进行查询,按唯一用户GUID对它们进行分组(因此相同的用户不在结果中两次),然后从表B返回这些用户的全名。

我可以在sql中做到这一点没有太多麻烦,但我想使用Hibernate,所以我不必手动解析sql结果。这是使用Hibernate的重点之一,不是吗?

现在我有Hibernate映射,它将表A中的每一列映射到一个DAO对象中的字段(以及我猜的get / set方法),我只是为了保存Table的数据。

我还可以使用Hibernate DAO来分别访问每个表,并在不同的步骤中执行上面提到的每一项操作,但这样做(我假设)执行一个查询的效率会降低。

我编写了一个Service对象来保存从查询中返回的数据(我的示例已经简化了 - 我将保留表A中的一些其他数据并从表B中获取多个列)但是我在如何编写可以进行连接的DAO,或使用我必须进行连接的DAO。

仅供参考,这是我的hibernate配置文件的示例(简化以匹配我的示例):

<hibernate-mapping package="com.my.dao">
  <class name="TableA" table="table_a">
  <id name="pkIndex" column="pk_index" />
  <property name="userGuid" column="user_guid" />
  <property name="managerGuid" column="manager_guid" />
  </class>
</hibernate-mapping>

然后我有一个DAOImplementation类来执行查询并返回像

这样的列表
public List<TableA> findByHQL(String hql, Map<String, String> params)

等。我不确定“最佳实践”是怎样的。

1 个答案:

答案 0 :(得分:3)

确定。首先,我注意到你在问题中主要讨论表格,所以我认为你错过了关于Hibernate的重要观点。 Hibernate是一个 ORM Object-Relational Mapping)工具,它是一个有助于将对象映射到关系模型并操纵数据的工具使用对象范例。

因此,在使用Hibernate时,您应该考虑在它们之间具有关联的对象,而不是表。对象,我的意思是商业实体,如ProjectEmployee,而不是DAO。 DAO是一种以技术无关的方式(JDBC,Hibernate等)对数据访问层建模的方法,它们不代表数据库记录。 Hibernate映射文件用于将这些实体映射到表并描述它们的关联。

换句话说,而不是“TableA”和“TableB”,我希望读到类似的东西(这只是一个例子):

  

我有一个Employee班,Employee可以作为项目成员或项目经理在Project上工作。我在ProjectEmployee之间为团队成员使用了多对多关联,并为项目ProjectEmployee之间建立了多对一关联经理。以下是Hibernate映射文件和相应的Java类......

然后,要查询此模型,您应该再次考虑对象。同样,这个例子是虚构的(没有对象模型和关联的映射它没有意义),但你的HQL查询可能如下所示:

select distinct project.teamMembers 
from Project as project 
where project.projectManager.id=:id 

总结一下,我认为您需要重新思考您的问题以及解决问题的方法。现在,你似乎走错了路。