【问题标题】:Hibernate query criteria for join between 3 tables3个表之间连接的休眠查询条件
【发布时间】:2012-07-05 06:59:57
【问题描述】:

我有一个 sql 查询:

select * from A
INNER JOIN B
ON A.id = B.id
INNER JOIN C
ON B.id = C.id
INNER JOIN D
ON C.id = D.id
where D.name = 'XYZ'
   and D.Sex = 'M'

我一直在尝试为上述 sql 提供休眠查询条件,但遇到了问题。有人可以帮忙吗。

【问题讨论】:

  • 你想要什么结果? A 实例?
  • Spear,是的..我需要来自 A 的实例
  • Hibernate 是关于 OR 映射的。没有人仅仅通过查看您的 SQL 就知道您的实体是什么样的。它可以像“来自 A where a.b.c.d.name='XYZ' and a.b.c.d.sex='M'”一样简单,或者如果您没有适当的关系则不可行

标签: java hibernate hibernate-criteria


【解决方案1】:

在您的问题上,您想要执行 笛卡尔连接,但 Criteria 不支持此操作,但您可以使用 HQL 执行此操作,如下所示。还有一个类似的问题here

使用 HQL 查询,您可以执行以下操作:

select a from 
   A a, 
   B b, 
   C c 
where 
   a.id = b.id and 
   c.id = b.id and 
   d.id = c.id and 
   d.name = 'XYZ' and 
   d.sex = 'M'

该查询用于常规休眠查询:

Query query = session.createQuery(query); // <-- here you use the query above
List results = query.list();

【讨论】:

  • 我必须使用hibernate的查询条件来做到这一点。对于 ex- Criteria c = session.createCriteria(Dokument.class, "dokument"); c.createAlias("dokument.role", "role"); // 默认内连接 c.createAlias("role.contact", "contact"); c.add(Restrictions.eq("contact.lastName", "Test"));返回 c.list();
【解决方案2】:
Criteria c = session.createCriteria(A.class, "a");
                    .createAlias("a.b", "b")
                    .createAlias("b.c", "c")
                    .createAlias("c.d", "d")
                    .add(Restrictions.eq("d.sex", "M"))
                    .add(Restrictions.eq("d.name", "XYZ"));

【讨论】:

  • 当我们说 session.createAlias("a.b",b).. 它会在 A 和 B 之间创建一个内部连接吗?
  • criteria.createAlias("a.b","b") 与仅说 criteria.createAlias("b","b") 有何不同
  • 不会有什么不同,但是,对 createCriteria 的初始调用给出了一个别名:createCriteria(A.class, "a")。因此,从 A 实例中进一步引用字段需要使用“a”。前缀。
  • 其实我不认为他们必须,但至少他们可以。我发现为每个实体分配别名更清楚,甚至是根实体。是的,正如 javadoc 指出的那样,它创建了一个内部连接。
猜你喜欢
  • 2016-05-02
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
相关资源
最近更新 更多