【问题标题】:how can get records from three tables using join in hibernate?如何在hibernate中使用join从三个表中获取记录?
【发布时间】:2013-12-17 20:18:24
【问题描述】:

我在 mysql 中使用此命令并轻松检索我的记录,但我无法在 Java 中执行此操作。 请指教。

select * from table1 
   LEFT JOIN table2 ON table1.FRID=table2.FRID 
   LEFT JOIN table3 ON table1.FRID=table3.FRID 
 where table1.FRID='000000338';

如何在 Java 中使用 hibernate(条件或 HQL)做到这一点。

【问题讨论】:

  • 这对我来说看起来像是有效的 HQL,只要您映射了三个名为 table1table2table3 的实体,每个实体都有一个名为 FRID 的列。没有任何映射很难判断出什么问题。也许FRID 是数字类型?在这种情况下删除'
  • 我更喜欢 Criteria API,它是完美的 OO 方法,还可以将查询与代码分离/避免。

标签: java mysql hibernate hql


【解决方案1】:

除非你展示你的映射,否则没有有意义的答案。

您需要注意的一件事是:不要将 Hibernate 视为访问数据库的另一种语言。您应该将其视为对象关系映射工具。完成映射后,在大多数情况下,您应该使用域模型,而不是考虑数据库表。

假设您已经为 Table1-3 正确映射了您的实体(我们将实体称为 Foo1、Foo2 和 Foo3),并且您的关系也已正确映射,HQL 应该如下所示

select foo from Foo1 foo
left join fetch foo.foo2
left join fetch foo.foo3
where foo.id = '000000338'

【讨论】:

    【解决方案2】:

    在 Hibernate 中,您必须考虑对象 (OO)。因此,您的查询中的表应更改为实体。等等。 如果在实体中定义了表(实体)之间的关系,Hibernate 将只允许表之间的连接。 (例如,通过 @OneToMany 之类的注释)

    因此,如果定义了必要的关系,HQL 将类似于(假设您加入的 2 个表通过 Hibernate 与“table1”链接/映射):

    from Table1Class as table1alias
    left join fetch Table2Class
    left join fetch Table3Class
    where table1alias.idPropertyInTable1Class = '000000338'
    

    如果您不希望 Hibernate 返回 Entities,则应检查 ResultTransformer,例如 here

    【讨论】:

      猜你喜欢
      • 2011-01-06
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 2022-08-11
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      相关资源
      最近更新 更多