2013-06-18 50 views
3

我以JSON格式返回SQL查询的结果。结果是好的,但是键(在查询中指定的列)缺失。为了获得关键字名称,我必须将类与查询关联吗?我不认为这是杰克逊映射,因为当我明确使用它(对象映射器而不是让Spring在@ResponseBody中处理它)时,我会得到相同的结果。Spring @ResponseBody返回JSON,但缺少键

Spring 3.2.1,Hibernate 3.6。使用Hibernate createSQLQuery从5个表中获取结果。

List<EvalMasterEvalDetail> details = session.createSQLQuery(query).list(); 

结果如下:

[[61,"Conference","CME Conference"],[42,"Lecture","fellow lecture"]] 

应该

[[{"detail_id":61, "event_type":"Conference", "event_name":"CME Conference"}], 
[{"detail_id":42, "event_type":"Lecture", "event_name":"fellow lecture"}]] 

回答

3

通过在Hibernate中默认的SQL查询返回标值的列表(在select单柱)或列表Object[](用于多列)。

你有后者的情况。在这种情况下,List<EvalMasterEvalDetail>并不意味着该列表包含EvalMasterEvalDetail的实例,因为list()返回原始List,因此您有未经检查的转换。

如果结果的每个元组都表示一个映射实体(或多个映射实体),则可以使用addEntity() and addJoin()将它们转换为实体。

如果结果的每个元组都表示一个任意(非映射)类,则可以使用ResultTransformer(如AliasToBeanResultTransformer)。

您也可以将Object[] s手动转换为目标对象(在复杂情况下有用)。

+0

如何添加addEntity到JPA Repository @Query? – Shamseer

0

您可以通过遍历列表并以String形式返回给客户端来准备JSONObject或JSONObject的列表。