Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate如何检索层次结构对象_Java_Hibernate_Hql - Fatal编程技术网

Java hibernate如何检索层次结构对象

Java hibernate如何检索层次结构对象,java,hibernate,hql,Java,Hibernate,Hql,我有以下beans任务、ServerDetails和ApplicationDetails。 我希望根据特定的应用程序名称检索所有任务、它们的服务器详细信息和应用程序详细信息 根据结果,我希望能够以如下方式检索数据: task.getServers().getApplicationDetails() 实际上,我得到的似乎是平面数据作为对象[]的表示 有什么办法可以实现我的提议吗 下面是我的代码 class Task { private String taskId; private

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

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

实际上,我得到的似乎是平面数据作为对象[]的表示

有什么办法可以实现我的提议吗

下面是我的代码

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

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

class ApplicationDetails {
   private String id;
}
类任务{
私有字符串taskId;
专用服务器;
}
类服务器详细信息{
私有字符串id;
专用集应用程序;
}
类应用程序详细信息{
私有字符串id;
}
HQL:

StringBuilder hql=新的StringBuilder(256);
append(“来自任务h、服务器详细信息服务、应用程序详细信息应用程序”);
hql.append(“其中h.executionDate>”);
hql.append(“添加到日期(”);
append(DBDateFormatter.getInstance().formatDate(cal));
hql.追加(“,”);
append(DBDateFormatter.getInstance().getOracleDateFormat());
hql.append(“'),h.id=ser.task.id,ser.id=app.server,app.name='XXX');
附加(“h.executionDate desc命令”);
字符串hql=hql.toString();
Query=session.createQuery(hql);
结果=(List)query.List();

您应该只检索主对象

另一方面,您可以:

  • 会话
    尚未关闭时导航到它们(根据需要运行附加查询,称为lazy;这非常便于使用)
  • 使用
    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()

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

    +1。这里要记住三件事:(a)上面的select应该使用LEFT-join-fetch,除非您100%确定始终填充了服务器/应用程序;(b) 它可能返回重复的
    任务
    实例,因此结果列表应该被过滤(例如,包装在集合中);(c)完全不需要使用
    to_date()
    和格式化日期-将其指定为参数,并在查询中将其设置为实际日期。您好,我想向hql中添加类似的内容:hqlQ.append(“左连接获取h.p on(h.id=p.task.id)和p.applicationName in(“+apps.toString()+”))你知道怎么做吗?@Keren在“h”和“p”之间,关系似乎通过“task”进行,这会更容易。对于“applicationName”,它属于查询的“where”部分。
        SELECT h 
        FROM Task h
        JOIN FETCH h.serveurs ser
        JOIN FETCH ser.applications app 
        WHERE h.executionDate > 
        .... // no need to specify the joins