【问题标题】:JPA - How to access query meta data?JPA - 如何访问查询元数据?
【发布时间】:2011-07-27 21:21:14
【问题描述】:

我正在为我的应用程序创建通用报告逻辑,并希望能够运行任何查询并解析响应。报告的输入是我使用 EntityManager.createNativeQuery(query) 运行的原生 SQL 查询。

我的所有这些工作都很好,但目前我还必须指出查询响应的返回“标题”。

例如,对于这个查询:

SELECT name, email FROM users;

我需要知道我正在从查询中取回姓名和电子邮件。我从运行查询中得到的只是一个字符串数组列表。不知何故,我希望能够为这个特定查询返回一个包含 ["name", "email"] 的数组或列表。

我没有看到查询 Query 对象以找出此信息的方法。我也没有在响应中看到任何有关此数据的迹象。有没有办法在 JPA 中获取这些数据?

具体来说,我使用的实现是 EclipseLink。

谢谢。

【问题讨论】:

  • @ChadNC - 不过,我如何通过 JPA 获取该对象?我了解通过 JDBC 使用该对象,但无法通过 JPA 获取该对象的句柄。
  • 您使用 jpa 原生查询而不是 jdbc 的原因是什么?
  • 应用程序的其余部分使用 JPA(没有本机查询),因此这是我们当前进入数据库后端的方式。我正在使用本机查询,因为我正在生成一堆报告查询,这些查询基本上将来自多个实体的数据汇集在一起​​——比如用户登录的次数,或者用户在系统中创建的对象数量。对于这一部分,我不想编写新代码来处理新报告——我只想运行查询并显示数据。

标签: java jpa eclipselink


【解决方案1】:

EclipseLink 还允许原生查询返回 Maps 而不是 Object[]。

使用“eclipselink.result-type”提示。

"eclipselink.result-type"="地图"

【讨论】:

  • 这正是我所需要的。谢谢!
【解决方案2】:

以下查询从数据库中获取所需字段并使用适当的构造函数设置到对象中并返回对象列表。

SELECT NEW package_name.User(u.name,u.email) FROM User u;

这将返回用户对象列表而不是字符串数组,其中设置了名称和电子邮件字段,其余字段设置为其默认值。

您必须只传递需要获取的字段,但必须为此提供构造函数。在这种情况下,对于 User 类应该有字段名称、电子邮件的构造函数。

这里您不必记住字段名称,只需使用 accessor(get) 方法从对象中获取所需的详细信息。

【讨论】:

  • 我觉得我的例子有点过于简单了。我将为本节执行的大多数查询将跨越多个实体。詹姆斯建议的提示确实是我一直在寻找的那种东西。感谢您的帮助。
【解决方案3】:

使用 AspectJ,您可以从查询中获得所需的信息。

【讨论】:

  • 我可以看到它正在工作。我们目前不使用面向方面的代码,我不想仅仅为此添加它,特别是因为我已经有了一个可行的解决方案。詹姆斯建议的提示确实是我一直在寻找的那种东西。感谢您的帮助。
猜你喜欢
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 2021-08-06
  • 2012-05-30
  • 1970-01-01
相关资源
最近更新 更多