跨表的OR映射

时间:2012-01-17 20:43:13

标签: java sql hibernate orm inner-join

我确信不同的ORM工具会以不同的方式解决问题,但对于or-mapping的概念来说是全新的,我并不真正关心具体的实现,因为我是通用的解。如果没有特定的ORM框架就无法回答这个问题,那就让我们来看看Hibernate。

我理解or-mapping的基本前提,但我很好奇这些框架如何处理跨多个表的查询,例如查询中存在JOIN时发生的情况。

SELECT f.fizz_name, b.buzz_foo
FROM fizz f
INNER JOIN buzz b
ON f.buzz_id = b.buzz_id
WHERE b.buzz_bar < 10

现在我们没有从or-mapper中获得一个漂亮,干净,单一的POJO。我想知道这是否是一个or-mapping崩溃的区域和直接的JDBC是程序员必须使用的。

老实说,我自己给了这个,并且在Hibernate文档中找不到任何表明在这种情况下会发生什么的东西。

提前致谢!

3 个答案:

答案 0 :(得分:0)

正如您所指出的,不同的ORM工具可能会以不同的方式处理它,但在休眠时,您会得到一个数组列表,其中每列都是Object []中的一个对象。

See section 16.6 here了解更多信息。

关键是你不需要使用普通的sql来获取连接查询的结果,至少使用Hibernate。

答案 1 :(得分:0)

我熟悉的大多数ORM框架将允许您将来自不同表的任意字段映射到单个代码对象。但是,如果您发现自己需要这样做,那么立即问自己为什么您的数据分散在数据库中,而代码表明它在逻辑上是合理的。

几乎所有发生这种情况的情况下,对象的代码表示太大而需要分解为它的组成部分,或者对象的DB表示是碎片化的数据的相关性比DB指示的要高得多。

处理方式的具体细节因ORM而异,但hibernate有许多不同的处理方法,包括在字段映射中指定特定查询。

答案 2 :(得分:0)

这个问题最终可能会引发关于object-relational impedance mismatch的讨论。为了避免这种讨论,您应该问自己,您是在设计OLTP还是OLAP应用程序。

  • OLTP:您的JPA实体主要直接映射到基础表,您可以轻松地对它们执行CRUD操作,读取,删除和存储它们。联接可以被hvgotcodes here指出,仅作为关联来自各种实体的数据来创建谓词的工具,但通常不会使用自定义投影创建新的ad-hoc类型。然后,Hibernate非常适合你。

  • OLAP:您的JPA实体很难映射到任何基础表,因为您要使用自定义投影(SELECT f.fizz_name, b.buzz_foo)创建的类型可以是列/函数/聚合的任意组合。这与加入本身无关,而是与您创建任意投影的事实。

正如ChssPly76所指出的那样,你的例子仍然很简单,Hibernate可以很好地处理它。为了获得你想要的POJO,你可以做这样的事情(来自文档):

select new Family(mother, mate, offspr)
from DomesticCat as mother
    join mother.mate as mate
    left join mother.kittens as offspr

但是如果你深入了解OLAP,你可能会发现Hibernate(HQL,JPQL)的表达力不够。这就是JDBC,jOOQmybatisSpring Templates可能更适合的地方。