这是一个棘手的问题,但是我会尽力向自己解释。
我在控制器类中有此方法:
@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中,以便能够呈现该数据,然后
这是我发现实现这一目标的方法,但我也听听其他选择。
谢谢。
答案 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"