如何在 Spring Boot JPA 中使用多个 json 数组?

Posted

技术标签:

【中文标题】如何在 Spring Boot JPA 中使用多个 json 数组?【英文标题】:how to work with multiple json array in Spring boot JPA? 【发布时间】:2017-05-22 17:31:23 【问题描述】:

我目前使用 Spring Boot 和 JPA,这是我的 DAO 类:

public interface UserDao extends JpaRepository<User,String> 
    @Query("select x from User x")
    public List<User> findAllActivit();

从这个 Dao 中,如果我访问探索这个 JpaRepository 的控制器,json 数据应该如下所示:


  "id" : "56e74ac5-d40e-11e6-846c-308d99bdc4d0",
  "user_name" : "alexander",
  "user_password" : "e46fc836cca3acec03944314d1457c2ae6c68ef3",
  "user_real_name" : "alexander darmawan",
  "user_cuti_amount" : 9,
  "user_position" : "head of business analyst",
  "user_join" : "2012-09-10",
  "activityList" : [ 
    "id" : "185aeb3b-d52b-11e6-bd89-308d99bdc4d0",
    "activity_date" : "2017-01-18",
    "activity_name" : "Reject Julia Eka Ananda's cuti"
  , 
    "id" : "a22af0d9-d529-11e6-bd89-308d99bdc4d0",
    "activity_date" : "2017-01-02",
    "activity_name" : "Accept Danu Nugraha's cuti"
   ]

有谁知道使上面的 json 数据变成这样的查询:


      "idfromuser" : "56e74ac5-d40e-11e6-846c-308d99bdc4d0",
      "idactivity" : "185aeb3b-d52b-11e6-bd89-308d99bdc4d0",
      "activity_date" : "2017-01-18",
      "activity_name" : "Reject Julia Eka Ananda's cuti"
,
      "idfromuser" : "56e74ac5-d40e-11e6-846c-308d99bdc4d0",
      "idactivity" : "a22af0d9-d529-11e6-bd89-308d99bdc4d0",
      "activity_date" : "2017-01-02",
      "activity_name" : "Accept Danu Nugraha's cuti"

每一个帮助对我来说都是宝贵的

【问题讨论】:

JPA 和 Spring 数据存储库与 JSON 没有任何关系。如果要更改 JSON,则将其他对象序列化为 JSON,或者更改这些对象的 JSON 映射。 我还是新手,所以我尝试将查询更改为这样的 @Query("select activityList from User x") 并且结果只是从 activityList 公开列表。那我想我只需要用身份证加入它吗?因为有2个id,可以用别名吗? 【参考方案1】:

Spring Data JPA 与您尝试尝试的 JSON 转换无关。这需要在我们从数据库返回结果后在Java 中完成,即我们需要将活动列表从旧格式transform 转换为新格式,如下例所示:

public static void main(String[] args) throws Exception
    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, Object> value = objectMapper.readValue("  \"id\" : \"56e74ac5-d40e-11e6-846c-308d99bdc4d0\",  \"user_name\" : \"alexander\",  \"user_password\" : \"e46fc836cca3acec03944314d1457c2ae6c68ef3\",  \"user_real_name\" : \"alexander darmawan\",  \"user_cuti_amount\" : 9,  \"user_position\" : \"head of business analyst\",  \"user_join\" : \"2012-09-10\",  \"activityList\" : [     \"id\" : \"185aeb3b-d52b-11e6-bd89-308d99bdc4d0\",    \"activity_date\" : \"2017-01-18\",    \"activity_name\" : \"Reject Julia Eka Ananda's cuti\"  ,     \"id\" : \"a22af0d9-d529-11e6-bd89-308d99bdc4d0\",    \"activity_date\" : \"2017-01-02\",    \"activity_name\" : \"Accept Danu Nugraha's cuti\"   ]", Map.class);

    List<Map<String, Object>> activityList = (List<Map<String, Object>>) value.get("activityList");

    List<Map<String, Object>> transformedList = new ArrayList<>();
    for(Map<String, Object> element : activityList)
        Map<String, Object> transformedElement = new LinkedHashMap<>();
        transformedElement.put("idfromuser", value.get("id"));
        transformedElement.put("idactivity", element.get("id"));
        transformedElement.put("activity_date", element.get("activity_date"));
        transformedElement.put("activity_name", element.get("activity_name"));
        transformedList.add(transformedElement);
    

    System.out.println(objectMapper.writeValueAsString(transformedList));

【讨论】:

您使用对象映射器,但如果我想通过 List 制作它怎么样。这是我的控制器@RequestMapping("/useractivity") public List&lt;User&gt; findAct() throws Exception return useri.findAllActivit(); 我不知道如何映射它 在这种情况下,您需要将 idfromuseridactivity 字段添加到 User 类并在发送回响应之前设置这些字段。或者更好的是,创建一个名为 UserDto 的新类

以上是关于如何在 Spring Boot JPA 中使用多个 json 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中使用 Hibernate/JPA 返回多级 json

如何在JAVA JPA Spring Boot中的一个SQL查询中选择多个数据

Spring Boot 整合 JPA 使用多个数据源

Spring Boot JPA:为同一参数传递多个值 (JPQL)

使用 Spring Boot 自动装配具有 jpa 和非 jpa 特征的多个数据源

使用Spring Boot JPA配置多个数据源