将List<javax.persistence.Tuple>序列化为JSON

3
我正在使用JPA(EclipseLink 2.5.2)和Jersey 2.27在Java 8下的Tomcat 8上开展项目。目前,我使用映射实体和一些简单列表(不同的值,键值对)检索结果。我已经实现了服务器端的分页、过滤和排序。现在,我正试图添加动态聚合数据集的功能。
我已经在SO和其他网站上搜索了最佳方法来序列化从我的条件构建器查询返回的元组列表。到目前为止,我没有找到能回答我的问题的东西。除非这里有很好的指针,否则我可以想到三种方法来做到这一点:
1.使用反射创建适当的对象并在我的查询中提供它;
2.一次逐个地运行结果,并将自己的JSON写入StringBuffer中的每个元素;
3. ArrayList<HashMap<String,Object>>其中HashMap是使用别名和匹配结果构建的,然后添加到列表中,列表像往常一样被序列化。
所以如果没有“轻松”的方法序列化元组列表,那么以上哪种方法最合理?选项3肯定可行,但对我来说感觉像一个笨拙的解决方法。

2
List<Map<String, Object>> 看起来很正常。也许你可以在 EclipseLink 层面将结果转换为映射列表?参见此问题:JPA 2.0原生查询结果作为映射。我不确定,但也许有一种方法可以将 List<Tuple> 转换为 List<Map> - Michał Ziober
1
@MichałZiober 谢谢!我重写了一些代码,使用CreateQuery代替CreateTupleQuery,并采用了您的建议,这使得代码更加清晰,也允许我删除所有结果的操作。感谢您的帮助! - John Kuhns
如果您认为我的评论有帮助并且对您有所帮助,我可以将其转换为答案,以便您可以接受它。也许对其他人也会有用。 - Michał Ziober
@MichałZiober,我无法想象有比这更好的答案,请您发表。 - John Kuhns
1个回答

2
一般来说,在业务逻辑中使用反射并不好,因此您应该首先排除第一个选项(1.)。逐个序列化对象听起来很不错,当您想要使用流API时,这是一个不错的选择,但在您的情况下不是一个选项(2.)。第三个选项(3.)看起来非常正常,也是一个很好的解决方案,因为它是通用的,List<Map<String,Object>>非常适合JSON规范:
  • JSON数组 - List
  • JSON对象 - Map
    • 属性 - String
    • 任何JSON对象 - Object
你应该尝试在EclipseLink层面上转换查询结果。请参见JPA 2.0原生查询结果作为映射问题,其中建议将查询结果转换为ResultType.Map

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接