我有一个连接 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/