【问题标题】:java hibernate criteriajava休眠标准
【发布时间】:2012-12-24 17:10:54
【问题描述】:

我的数据库中有以下表结构:

 Table A:                     Table B:                       Table C:
 _______________________      ______________________________  ______________________
 | Field | Type | Key  |     | Field | Type | Key          |  | Field | Type | Key  |   
 ______________________|     |_____________________________|  |_____________________|
 | a_id  | Int  | PRI  |     | a_id  | Int  | FK of A(a_id)|  | c_id  | Int  | PRI  |
 |     ...       ...   |     | c_id  | Int  | FK of C(c_id)|  |       ...           |
 |_____________________|      ______________________________  |_____________________|

还有对象:

  class A {
        List<C> list;
        ...
   }

现在我想从数据库中接收一个对象 A,其中包含由表 B 组合的所有 C 对象。我有接收正确对象 A 的标准,但我不知道如何接收列表对应的 C 对象:

    Criteria crit = ...;
    A a = crit.uniqueResult();

这是给我正确结果的 SQL 查询,现在应该在标准中“翻译”:

 select c.* 
 from A as a, 
      B as b, 
      C as c 
 where a.a_id = b.a_id and b.c_id = c.c_id;

有人知道如何制定标准吗?

【问题讨论】:

  • 您是否尝试过使用 HQL 而不是 Criteria api?您的实体看起来如何?
  • 所有其他数据库访问都是使用 Criterias 完成的,因此我想坚持那个;我添加了有效的 SQL 查询,该查询应该在标准中“翻译”

标签: java hibernate criteria


【解决方案1】:

如果你有

class A {
    List<C> list;
    ...
}

AC 都是@Entitys,您的标准必须如下所示:

// Create criteria on class A
Criteria criteria = session.createCriteria(A.class);

此时,如果您执行criteria.list(),您将获得所有A 对象,每个对象都有一个C 值列表,您只有ID。为了带来完整的 C 对象,您需要一个额外的:

criteria.createAlias("list", "listC");

这将为AC 创建一个别名(即内部连接)。现在,假设您有一个 a(属于 A 类),您可以使用 a.getList().get(i).getWhateverFieldFromC();所以现在你已经为每个A 实例填充了Cs 列表。

不要忘记最后做一个criteria.list() 来检索列表。就这些了。

附注这是假设(当然)实体AC 被正确映射。

【讨论】:

    猜你喜欢
    • 2011-10-09
    • 2021-10-19
    • 2011-08-13
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多