java - 使用 Hibernate 做涉及两个表的查询

标签 java hibernate orm

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

现在我想做一些不同的事情,但我不确定配置和语法需要如何结合在一起。假设我有两张 table 。

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

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

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

我可以在 sql 中轻松完成此操作,但我想使用 Hibernate,因此我不必手动解析 sql 结果。这是使用 Hibernate 的要点之一,不是吗?

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

我也可以使用 Hibernate DAO,我必须单独访问每个表并在单独的步骤中执行我上面提到的每件事,但这样做的效率(我假设)比执行一个查询要低。

我编写了一个服务对象来保存从查询返回的数据(我的示例已简化 - 我将保留表 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)

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

最佳答案

好的。首先,我注意到您在问题中主要是在谈论表,所以我认为您遗漏了关于 Hibernate 的重要一点。 Hibernate 是一个ORM ( Object-Relational Mapping ) 工具,它是一个有助于将对象 映射到关系模型 并使用对象范式。

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

换句话说,我希望读到的不是“TableA”和“TableB”(这当然只是一个例子):

I have an Employee class, Employee can work on a Project as Project Members or as Project Manager. I'm using a many-to-many association between Project and Employee for the team members and a many-to-one association between Project and Employee for the project manager. Here are the Hibernate mapping files and the corresponding Java classes...

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

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

总而言之,我认为您需要重新考虑您的问题以及解决问题的方法。现在,您似乎走错了路。

关于java - 使用 Hibernate 做涉及两个表的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2225857/

相关文章:

java - MIDI channel 轨道关联

java - 如何优化或更改 hibernate 生成的 SQL 语句

android - 如何将我的 getEmptyForeignCollection() 对象与我的父对象链接起来?

java - 如何解析一行的前6个字符串

java - java中匹配字符串正则表达式?

java - Spring MVC - jsp 不渲染

java - 使用 spring 在 Quartz 调度程序中完成作业后插入数据

java - Spring/Hibernate 获取包含列表的对象列表

python - 在 django 中预取有限数量的相关对象

c# - 将枚举作为字符串存储在数据库中