java - 如何将数据库查询映射到对象 [在 Java 中]?

标签 java hibernate orm

我有一个连接 5 个表的查询。 然后我用我需要的列值填充我手工制作的对象。

使用特定工具解决该问题的广泛通用解决方案是什么?有这样的工具吗?

我才刚刚开始学习 Hibernate,所以我的问题是:Hibernate 是解决这个问题的正确决定吗?

Hibernate 将一个表映射到一个类。所以,如果我有 5 个类而不是 5 个表,那没有什么区别。仍然很难将查询结果加入到一个类中

是否可以使用 hibernate 将 THE QUERY 映射到我预先定义的结构(类)中,就像我们处理表映射一样?或者更好的是,它能否像逆向工程那样将查询结果映射到有意义的字段中[使用字段自动创建类]?

<我> 我一直在考虑 View 但是..每次我们需要一个复杂的查询时都创建一个新 View ..太冗长了。

正如 S.Lott 所问,这是一个简单版本的问题:

一般问题:

select A.field_a, B.field_b, C.field_c 
 from table_a A inner join table_b B inner join table_c C 
 where ...

每张表包含100个字段 查询返回3个字段,但每个字段都属于唯一表

如何以面向对象的方式解决该问题? 设计一个新对象,其属性与查询的返回值相对应。

我想知道这是否是正确的 [也是唯一可能的] 决定,是否有任何共同的解决方案。

另请参阅我的评论。

最佳答案

ORM 的重点是将对象映射到关系。

ORM 的要点是——明确地——去处理特定 SQL 连接的细节。

这是理解 ORM 的一个基本指南。

SQL 连接是一种 hack,因为 SQL 没有正确的导航。

为了进行 ORM 设计,我们有意将 SQL 连接注意事项放在一边(很大程度上)无关紧要。放弃旧方法。没关系,真的。 SQL 拐杖不能很好地支持我们。

第 1 步。定义话语域。现实世界的对象。

第 2 步。定义作为现实世界事物的高保真模型的实现类。

第 3 步。将对象映射到关系。这里是 hack-arounds 开始的地方。 SQL 没有各种集合——它只有表。 SQL 没有子类,它只有表。所以你必须在对象类和表之间设计一个“足够好”的映射。理想情况下,这是一对一的。但实际上,事情并非如此。通常你会有一些非规范化来处理类层次结构。除此之外,它应该运作得相当好。

是的,您必须添加没有对象映射的多对多关联表。

第 4 步。大功告成。编写您的应用程序。

“但是我的查询连接了 5 个(或 3 个)表但只从每个表中获取一个属性呢?”

那怎么办?其中一张表是您正在处理的真实对象。这 5 个(或 3 个)表中的另一个是 1-m 嵌套集合、m-1 容器或 m-m 关联的一部分。这只是对象之间的导航。

1 米的嵌套集合是 SQL 视为“结果集”的那种东西。在 ORM 中它将成为一个适当的对象集合。

一个m-1 contain就是典型的FK关系。在 ORM 中,它只是通过普通对象导航获取相关对象。

一个 m-m 关联也是一个对象集合。这是一个奇怪的集合,因为两个对象是彼此集合的成员,但它只是一个对象集合。

您绝不会设计与查询相匹配的对象。您设计一个与现实世界相匹配的对象,并将其映射到数据库。

“性能呢?”只有当你颠覆了 ORM 的简单映射规则时,这才是一个问题。千载难逢的你必须创建一个特殊用途的 View 来处理对象之间非常大的面向批处理的连接。但这真的很少见。通常,重新考虑 Java 程序的导航模式会提高性能。

请记住,ORM 会缓存您的结果。每次“导航”可能不是对数据库查询的完整“往返”。 ORM 可能会为您批处理一些查询。

关于java - 如何将数据库查询映射到对象 [在 Java 中]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1873316/

相关文章:

java - hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size 有什么区别?

java - 从另一个库调用一个库函数

java - 程序逻辑错误

java - JSTL 填充服务器端变量

java - 用Java写Excel文件

java - 在 Hibernate 中指定表之间的多个一对多关系

java - 找不到元素 'persistence' 的声明

java - 调用 hibernate session.get 方法

database - 使用事件源摆脱关系数据库?

node.js - 如何使用基于关联的 sequelize(node Js) 从 mysql 中查找数据?