2011-04-01 48 views
3

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

我有这一切工作正常,但目前我还必须表明查询响应返回“标题”。

例如,对于这个查询:

SELECT name, email FROM users; 

我需要知道我取回从查询的姓名和电子邮件。我从运行查询得到的所有信息都是一个字符串数组列表。不知何故,我希望能够找回这个特定查询具有[“name”,“email”]的数组或列表。

我没有看到一种方式来询问Query对象来找出这些信息。我在回应中也看不到有关这些数据的任何迹象。有没有办法在JPA中获取这些数据?

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

谢谢。

+0

查找到的ResultSetMetaData – ChadNC 2011-04-01 18:11:40

+0

@ChadNC - 我将如何通过JPA获取该对象的保持有关系吗?我明白通过JDBC使用该对象,但不能通过JPA获得该类对象的句柄。 – MikeTheReader 2011-04-01 18:24:08

+0

您使用jpa本机查询而不是jdbc的原因是什么? – 2011-04-01 18:34:23

回答

4

EclipseLink还允许本地查询返回地图而不是Object []。

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

“eclipselink.result型” =“地图”

+0

这正是我所需要的。谢谢! – MikeTheReader 2011-04-04 14:49:35

0

下面的查询从数据库&中获取必填字段使用相应的构造函数设置到对象中&返回对象列表。

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

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

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

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

+0

我觉得我的例子有点太简单了。我将为本节所做的大部分查询将跨越多个实体。詹姆斯提出的暗示确实是我期待的那种事情。谢谢你的帮助。 – MikeTheReader 2011-04-04 14:52:00

0

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

+0

我可以看到工作。我们目前不使用面向方面的代码,我不想仅仅为此添加它,特别是因为我已经有了一个工作解决方案。詹姆斯提出的暗示确实是我期待的那种事情。谢谢你的帮助。 – MikeTheReader 2011-04-04 14:53:38