如何执行和解析查询选择冬眠返回的对象内的json?

时间:2019-05-16 14:33:45

标签: json hibernate jpa

这是一个棘手的问题,但是我会尽力向自己解释。

我在控制器类中有此方法:

@CrossOrigin
@RequestMapping(value = "/dashboard", params = {"user"}, method = RequestMethod.GET,  produces = "application/json")
public ResponseEntity<Map<String, User>> getUser(@RequestParam(value = "user") String ldapId) {

    User user =  userService.findUserByLdapId(ldapId);

    if(user == null)
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);


    Map<String, User> result = new HashMap<String,User>();
    result.put(User.class.getAnnotation(JsonRootName.class).value(), user);


    return new ResponseEntity<>(result, HttpStatus.OK);

};

那个返回一个这样的json:

{
    "user": {
        "userId": 1,
        "fullName": "Carolina Ponce",
        "ldapId": "f8cygqn",
        "email": "carolina@blabla.com",
        "uType": "Administrador",
        "deleteFlag": "",
        "typeAccess": "",
        "roles": [
            {
                "roleId": 2,
                "roleName": "Account",
                "sections": []
            },
            {
                "roleId": 1,
                "roleName": "Admin",
                "sections": [
                    {
                        "sectionId": 1,
                        "sectionName": "Dashboard",
                        "components": [
                            {
                                "componentId": 1,
                                "componentName": "Rubros",
                                "componentQuery": "SELECT Vertical_Id AS ID, Vertical_Desc AS NAME FROM D_DW_COMERCIAL.BAS_Vertical ORDER BY Vertical_Desc"
                            }
                        ]
                    }
                ]
            }
        ]
    }
}

如您所见,我使用了休眠和@OneToMany注释来实现此目的。用户具有角色列表,角色具有部分列表,依此类推。

最后,我在表中存储了一个查询,正如您在componentQuery中看到的那样。该查询的目的是将要呈现为列表的内容带到前端,但是该查询对于每个组件都会有所不同,这就是为什么我不能使用休眠获取select数据的原因。

我认为,一旦有userService返回的用户,我需要一种方法来让componentQuery执行该操作,并将执行结果放入相同的json中,以便能够呈现该数据,然后

这是我发现实现这一目标的方法,但我也听听其他选择。

谢谢。

1 个答案:

答案 0 :(得分:0)

这是获取代表查询结果单元格的对象列表的通用方法,因此您可以将其放入JSON。

key

如果您怀疑JSON序列化程序可以处理// Here I assume that component query is obtainable from User entity String componentQuery = user.getRoles().get(X).getSections().get(Y) .getComponents().get(Z).getComponentQuery() Query query = getEntityManager().createNativeQuery(componentQuery); List<Object[]> objects = query.getResultList(); return objects; ,则可以将List<Object[]>转换为List<List<Object>>

唯一的缺陷是查询结果的列名是未知的(因此无法在前端传递和显示它们),只有数据本身可用。但是,如果需要列名,则可以将它们与componentQuery一起放置。

所以不是

Object[]

您将拥有类似的东西

"componentQuery": "SELECT Vertical_Id AS ID, Vertical_Desc AS NAME FROM D_DW_COMERCIAL.BAS_Vertical ORDER BY Vertical_Desc"