【发布时间】:2012-07-26 02:11:31
【问题描述】:
在我的 GWT 2.4.0 应用程序中,我使用 RequestFactory 和 Hibernate/JPA。我有一个实体Agent,它通过@OneToMany 关系有许多Administrators。这个关联是LAZY 加载的。因此,当调用 find 服务时,不会加载代理的管理员,这在大多数情况下是所需的行为。
但是,我希望能够在使用 with 方法在客户端代码上触发 requestFactory 请求时表明我希望代理的管理员回来。所以我的客户端代码看起来像:
RequestContext.findAgent(agentId).with("administrstors").fire()
我的服务器端服务看起来像这样:
public Agent findAgent(Long id) {
return getEntityManager().createQuery("SELECT a" +
" FROM Agent" +
" WHERE a.id=:id", Agent.class)
.setParameter("id", id)
.getSingleResult();
}
我希望能够确定是否使用 with 方法发送请求。我需要自定义 JPA 查询以加载代理的管理员,以防客户端使用。有没有办法通过服务器端的 RequestFactory 访问请求的详细信息?
如果我知道客户端代码需要代理管理员,我的 JPA 查询将如下所示:
public Agent findAgent(Long id) {
return getEntityManager().createQuery("SELECT a" +
" FROM Agent a LEFT JOIN a.administrators admin" +
" WHERE a.id=:id", Agent.class)
.setParameter("id", id)
.getSingleResult();
}
任何见解将不胜感激。提前致谢。
【问题讨论】:
-
不知道 GWT 部分,但是 JPA 查询是错误的。应该是 select distinct a from Agent a left join fetch a.administrators admin where ...
-
@JBNizet:应该包含 DISTINCT 关键字。但是,您可以放弃提取。
-
不,你不能。没有获取,管理员将不会被加载。如果是,那么 fetch 将没有任何实用程序。
-
我在代码中的几个地方使用了没有 FETCH 关键字的 LEFT JOIN,然后我将集合返回到我的结果集中。我在 Hibernate 文档中搜索以找到解释。还在这里查看了 JPA 文档:docs.oracle.com/html/E24396_01/…:LEFT JOIN 的一个重要用例是启用相关数据项的预取作为查询的副作用。这是通过将 LEFT JOIN 指定为 FETCH JOIN 来完成的。
标签: gwt jpa requestfactory