【问题标题】:unnormalised data set to a nested document未标准化的数据集到嵌套文档
【发布时间】:2016-12-13 11:48:00
【问题描述】:

我正在使用 Derby 嵌入式数据库和 javax.json。据我所知,我无法将结果与德比连接起来。即:

ID | NAME | ROLE
----------------
1  | me   | admin, user
3  | root | root, user

我需要从规范化的数据库数据转到 Json 文档。除了使用中间映射和两步 SQL 查询之外,我看不到如何做到这一点。链接到其他人如何实现这一点将是一个很好的帮助。

ID | NAME | ROLE
----------------
1  | me   | admin
1  | me   | user
3  | root | user
3  | root | root

{
   users : [
      {
          "user_id":1,
          "user_name":"me",
          "roles":[
              "admin",
               "user"
           ]
       },
       ...ect.

    ]
}

在我使用领域时,用户需要能够拥有多个角色。

【问题讨论】:

  • “除了使用中间映射和两步 SQL 查询之外,我看不到如何做到这一点。” - 如果您致力于只使用javax.json。您是专门寻找一些javax.json“魔法”,还是在寻找其他可能的解决方案,例如,如here 所讨论的?
  • 我发现 javax.json 是最有用的库。我经常填充一个循环遍历结果集的 JsonArrayBuilder,然后构建完成的 JSON。我被困在这里,因为您无法迭代 JsonBuilder 对象,只能迭代 JsonObject。

标签: java sql json jdbc derby


【解决方案1】:

这肯定是一个常见问题,但我无法通过搜索找到更多信息。

我最后使用了 SQL,这显然不会适用于所有情况。

"SELECT users.id, users.username, "
    + "SUM (CASE ROLE WHEN 'user-role' THEN 1 ELSE 0 END) , "
    + "SUM (CASE ROLE WHEN 'admin-role' THEN 1 ELSE 0 END) , "
    + "SUM (CASE ROLE WHEN 'root-role' THEN 1 ELSE 0 END) " 
    + "FROM users INNER JOIN user_roles ON user_roles.user_id = users.id "
    + "INNER JOIN roles ON user_roles.role_id = roles.id"
    + "GROUP BY users.id, users.username

使用 ROLE 可以取的每个值的总和,返回的行:(anId, aName, 1, 0, 1) 会告诉我 aName 是 root 和用户。

希望列表聚合将很快添加到 SQL 标准中。

【讨论】:

    【解决方案2】:

    为了记录,并为未来读者可能的利益,提供以下表格

    "users"
    
    id  username
    --  --------
     1  me
     3  root
     4  gord
    
    
    "roles"
    
    id  ROLE
    --  ----------
     1  admin-role
     2  user-role
     3  root-role
    
    
    "user_roles"
    
    user_id  role_id
    -------  -------
          1        1
          1        2
          3        2
          3        3
    

    Java 代码

    try (
            Statement st = conn.createStatement();
            ResultSet rsUser = st.executeQuery(
                    "SELECT DISTINCT id, username FROM users");
            PreparedStatement ps = conn.prepareStatement(
                    "SELECT ROLE " + 
                    "FROM user_roles INNER JOIN roles " + 
                        "ON roles.id = user_roles.role_id " + 
                    "WHERE user_id = ?")) {
        JsonObjectBuilder jobRoot = Json.createObjectBuilder();
        JsonArrayBuilder jabUsers = Json.createArrayBuilder();
        while (rsUser.next()) {
            JsonObjectBuilder jobUser = Json.createObjectBuilder();
            jobUser.add("user_id", rsUser.getInt("id"));
            jobUser.add("user_name", rsUser.getString("username"));
            ps.setInt(1, rsUser.getInt("id"));
            try (ResultSet rsRole = ps.executeQuery()) {
                if (rsRole.next()) {
                    JsonArrayBuilder jabRoles = Json.createArrayBuilder();
                    do {
                        jabRoles.add(rsRole.getString("ROLE"));
                    } while (rsRole.next());
                    jobUser.add("roles", jabRoles.build());
                }
            }
            jabUsers.add(jobUser);
        }
        jobRoot.add("users", jabUsers.build());
        JsonWriter jw = Json.createWriter(
                new FileOutputStream("C:/Users/Gord/Desktop/json.txt"));
        jw.writeObject(jobRoot.build());
        jw.close();
    }
    

    生产

    {
       "users":[
          {
             "user_id":1,
             "user_name":"me",
             "roles":[
                "admin-role",
                "user-role"
             ]
          },
          {
             "user_id":3,
             "user_name":"root",
             "roles":[
                "user-role",
                "root-role"
             ]
          },
          {
             "user_id":4,
             "user_name":"gord"
          }
       ]
    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 2019-10-22
      • 2021-12-31
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 2020-08-26
      • 2015-12-11
      • 1970-01-01
      相关资源
      最近更新 更多