【问题标题】:hibernate how to retrieve a hierarchy object休眠如何检索层次结构对象
【发布时间】:2009-10-28 11:53:37
【问题描述】:

我有以下 bean Task、ServerDetails 和 ApplicationDetails。 我希望根据特定的应用程序名称检索所有任务、它们的服务器详细信息和应用程序详细信息。

从结果中,我希望能够以如下方式检索数据: task.getServers().getApplicationDetails()

实际上,我将平面数据表示为 Object[]。

有什么办法可以按照我的建议去做吗?

以下是我的代码...

class Task {
    private String taskId;
    private Set<ServerDetails> servers;
}

class ServerDetails {
    private String id;
    private Set<ApplicationDetails> applications;
}

class ApplicationDetails {
   private String id;
}

HQL:

StringBuilder hql = new StringBuilder(256);
hql.append("FROM Task h, ServerDetails ser, ApplicationDetails app ");
hql.append("WHERE h.executionDate > "); 
hql.append("to_date('");
hql.append(DBDateFormatter.getInstance().formatDate(cal));
hql.append("',  '");
hql.append(DBDateFormatter.getInstance().getOracleDateFormat());
hql.append("') and h.id = ser.task.id and ser.id = app.server and app.name = 'XXX'");
hql.append(" order by h.executionDate desc");
String hql = hql.toString();

Query query = session.createQuery(hql);      
results = (List<Object[]>) query.list();

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    您应该只检索主对象。

    另一方面,您可以:

    1. Session 尚未关闭时导航到它们(根据需要运行其他查询,称为惰性查询;这是易于使用的理想选择)
    2. 使用 fetch 关键字在原始查询中检索它们。

    例子:

        SELECT h 
        FROM Task h
        JOIN FETCH h.serveurs ser
        JOIN FETCH ser.applications app 
        WHERE h.executionDate > 
        .... // no need to specify the joins
    

    您将能够通过以下方式检索数据:
    task.getServers().getApplicationDetails()

    【讨论】:

    • +1。这里要记住三件事:(a) 上面的选择应该使用 LEFT join fetch,除非你 100% 确定你总是有服务器/应用程序被填充; (b) 它可能会返回重复的 Task 实例,因此应该过滤结果列表(例如,包装在 Set 中); (c) 完全不需要使用to_date() 和格式化日期 - 将其指定为参数并在查询时将其设置为实际日期。
    • 嗨,我想在 hql 中添加类似的内容: hqlQ.append("LEFT JOIN FETCH h.prompts p on (h.id = p.task.id and p.applicationName in ( " + apps.toString() + ")) " 你知道怎么做吗?
    • @Keren 在 'h' 和 'p' 之间,关系似乎通过 'task',这样会更容易。对于“applicationName”,它属于查询的“where”部分。
    【解决方案2】:

    您可以像其他人所说的那样使用 LEFT JOIN FECH 检索对象图。我在检索对象图时发现了一个问题,当走下多对一关系时,如果没有额外的数据库访问权限,您将无法返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      相关资源
      最近更新 更多