【问题标题】:Get jsonArray Using Native query entity manager使用原生查询实体管理器获取 jsonArray
【发布时间】:2018-10-28 13:20:00
【问题描述】:

我有一个服务类如下:

public class RulesService {
    @PersistenceContext
    private EntityManager em;

    public  JSONArray getReportingTableData(String Query) {
        List<Object> list = em.createNativeQuery(Query).getResultList();

        return /*convert the above list as json array**/;
    }
}

所以,如果查询是“select col1 as name,col2 as agefrom table1”那么我的 jsonArray 应该是

[{"name":"test","age":"24"},{"name":"test1","age":"26"}]

我不想在这里使用pojo或实体类,因为查询会动态变化并且这里有很多表,所以我不想为每个表创建单独的java类。那是原因是我试图将其作为 JSONArray。

谁能给我正确的解决方案。

【问题讨论】:

  • 为什么没有使用List&lt;Map&lt;String,Integer&gt;&gt;
  • 我不认为你的 getResultList 会工作。它返回 List
  • 您也可以使用 SQL 调用来获取想要的数据。这些是灵活的。
  • @HadiJ 我已经尝试过了,因为 Prathamesh Jagtap 说 getResultList 返回 List 。所以我无法将它作为键值对来获取。它只是给出值数组
  • "age:26" 应该是"age":"26"

标签: java json spring java-8 hibernate-entitymanager


【解决方案1】:

对不起,伙计们,我可能会迟到,但有人可能会觉得这很有趣并节省了他/她的时间。 参考 [https://gist.github.com/baxtheman/44fd1601380d415eeec53d9e6d5587dc][1]

public List<ObjectNode> getQuery(
    Integer anno,
    Integer settimana) {

    Query q = em.createNativeQuery(
        "NATIVE SQL....",Tuple.class);

    List<Tuple> results = q.getResultList();

    List<ObjectNode> json = _toJson(results);

    return json;
}

private List<ObjectNode> _toJson(List<Tuple> results) {

    List<ObjectNode> json = new ArrayList<ObjectNode>();

    ObjectMapper mapper = new ObjectMapper();

    for (Tuple t : results)
    {
        List<TupleElement<?>> cols = t.getElements();

        ObjectNode one = mapper.createObjectNode();

        for (TupleElement col : cols)
        {
            one.put(col.getAlias(), t.get(col.getAlias()).toString());
        }

        json.add(one);
    }

    return json;
}

【讨论】:

    【解决方案2】:

    我猜你想像下面这样。您的查询结果是数组列表。 [["test","24"],["test2","26"]] 并且您想将其转换为 key-value

    List<Map<String,String>> result = listOfarray.stream()
                              .map(arr->{
                                  Map<String,String> map = new HashMap<>();  
                                  map.put("name",arr[0]); 
                                  map.put("age",arr[1]); 
                                  return map; 
                                })
                             .collect(Collectors.toList());
    

    【讨论】:

    • 正如我之前所说,查询是动态的,每个查询的列名也可以改变。在处理过程中将无法获取列名
    • 你可以有一个方法给出查询结果和列名。然后将其转换为您在我的答案中看到的。
    【解决方案3】:

    你可以使用ObjectMapper来做动态的。

    public  JSONArray getReportingTableData(String Query) {
        List<Object> list = em.createNativeQuery(Query).getResultList();
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
        String arrayToJson = objectMapper.writeValueAsString(list);
        JSONArray array = new JSONArray(arrayToJson);
    
        return /*convert the above list as json array**/;
    }
    

    【讨论】:

    • 它将我的 list 转换为 jsonArray ,但我的查询没有将它作为键值对返回。任何建议这样做
    • 替换 em.createNativeQuery(Query);到 Map resultMap = em.createNativeQuery(Query, Map.class).getResultList();
    • 可以分享mysql查询吗
    【解决方案4】:

    您可以使用 Jackson 的 ObjectMapper 做到这一点。这个tutorial很有意思。

    List<Object> list = em.createNativeQuery(Query).getResultList();
    final ByteArrayOutputStream out = new ByteArrayOutputStream();
    final ObjectMapper mapper = new ObjectMapper();
    
    mapper.writeValue(out, list);
    
    final byte[] data = out.toByteArray();
    System.out.println(new String(data));
    

    【讨论】:

      猜你喜欢
      • 2016-07-02
      • 2015-01-30
      • 1970-01-01
      • 2013-12-13
      • 2014-09-13
      • 2011-11-23
      • 1970-01-01
      • 2014-07-22
      • 2018-04-26
      相关资源
      最近更新 更多