【问题标题】:How to customize JPA find query based on RequestFactorys's with() method如何根据 RequestFactorys 的 with() 方法自定义 JPA 查找查询
【发布时间】: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


【解决方案1】:

不幸的是,这是不可能的;除了 with() 之外,您还必须将信息作为附加参数传递给方法。

仅供参考,两年前在 Google Wave 中讨论过(我有一个本地备份副本,但在网络上找不到其他地方),有几个建议(可选的 Set<String> 作为最后一个参数传递给服务方法——您的findAgent 方法——或线程本地属性列表)。
虽然没有实现类似的东西,回想起来我不确定它是否应该:将信息作为参数显式传递给您的方法更加明确/其中的 magic 更少。

【讨论】:

    猜你喜欢
    • 2020-09-26
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    相关资源
    最近更新 更多