hibernate如何检索层次结构对象

时间:2009-10-28 11:53:37

标签: java hibernate hql

我有以下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();

2 个答案:

答案 0 :(得分:3)

您应该只检索主要对象。

另一方面,你可以:

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

        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 :(得分:0)

您可以使用LEFT JOIN FECH检索对象图表。我在检索对象图时发现了一个crevent,当你走多对一的关系时,如果没有额外的数据库访问权限,就不能再回头了。