【问题标题】:Native Query Mapping on the fly openJPA即时本机查询映射 openJPA
【发布时间】:2012-10-19 15:51:36
【问题描述】:

我想知道是否可以动态映射命名的本机查询,而不是取回 Object[] 列表,然后循环遍历并以这种方式设置对象。我有一个电话,我知道它会返回大量数据集,我希望能够将其映射到我的实体。我可以这样做还是必须继续循环遍历结果集。

这就是我现在正在做的事情......

List<Provider> ObjList = (List<Provider>) emf.createNativeQuery(assembleQuery(organizationIDs, 5)).getResultList();

那是我的实体,列表(我的实体是提供者)。通常我只会返回List&lt;Object[]&gt; 然后我会遍历它以取回所有对象并将它们设置为新提供者并将它们添加到列表中......

//List<Provider> provList = new ArrayList<Provider>(); 
/*for(Object[] obj: ObjList)
{
    provList.add(this.GetProviderFromObj(obj));
}*/

如您所见,我将代码的那部分注释掉以尝试此操作。我知道如果您将本机查询放在实体本身中,然后通过 createNamedQuery 调用它,您可以映射命名本机查询。我会这样做,但我需要使用IN oracle 关键字,因为我有一个要检查的 ID 列表。它不仅仅是一个需要的。众所周知,本机查询不能很好地处理in 关键字。有什么建议吗?

唉,如果 NamedNativeQueries 只支持 IN 关键字就好了。

【问题讨论】:

  • 我对你的问题有点困惑。您是否在询问是否有办法让 OpenJPA 在您调用 createNativeQuery(...).getResultList() 时直接返回一个提供者对象列表,这样您就不必手动将对象转换为提供者?
  • 是的。我想到了。您需要设置一个命名映射,然后在调用本机查询时调用它。

标签: orm openjpa


【解决方案1】:

假设 Provider 被配置为 JPA 实体,您应该能够将类指定为 createNativeQuery 调用的第二个参数。例如:

List<Provider> ObjList = (List<Provider>) emf.createNativeQuery(assembleQuery(organizationIDs, 5), Provider.class).getResultList();

根据文档,“至少,您的 SQL 必须选择类的主键列、鉴别器列(如果已映射)和版本列(如果已映射)。”

有关详细信息,请参阅OpenJPA documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-08
    • 2021-06-13
    • 1970-01-01
    • 2013-01-11
    • 2012-11-23
    • 2014-06-25
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多