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