Hello社区有一个查询,是我有一个查询,它返回List <Map <Integer, String>>
查询HQL Hibernate:
@SuppressWarnings({ "unchecked" })
@Transactional(readOnly = true)
@Override
public List<Map<Integer, String>> obtenerPermisosForm(int icodUsu, int icodRol) throws Exception {
try {
StringBuilder hql = new StringBuilder();
hql.append("select new Map(opc.id.icodMaeMenu as icodMaeMenu, ");
hql.append("opc.videObj as videObj) ");
hql.append("from Sgmaeopc opc ");
hql.append("inner join opc.sgmaemenu men ");
hql.append("inner join men.sgusurol usr ");
hql.append("inner join usr.sgusuario us ");
hql.append("inner join usr.sgrol rl ");
hql.append("where opc.id.icodUsuario = :icodUsu ");
hql.append("and opc.id.icodRol = :icodRol ");
hql.append("and men.bactivo = :bactivo ");
hql.append("and us.bactivo = :bactivo ");
Query query = super.getSession().createQuery(hql.toString());
query.setParameter("icodUsu", icodUsu);
query.setParameter("icodRol", icodRol);
query.setParameter("bactivo", Constantes.ESTADO_ACTIVO_TRUE);
return query.list();
} catch (Exception e) {
throw new Exception( getGenerarError(Thread.currentThread().getStackTrace()[1].getMethodName(),
Constantes.NIVEL_APP_DAO,
this.getClass().getName(),
e.getMessage()) );
}
}
我尝试以这种方式捕获控制器数据。
List<Map<Integer, String>> permisos = userService.obtenerPermisosForm(getCVariableSesion().getIcodUsu(),
getCVariableSesion().getIcodRol());
for(Map<Integer, String> map : permisos) {
System.out.println("===> "+map+" | "+map.get("videObj"));
}
但我遇到的问题是捕获“icodMaeMenu”描述的整数代码的值
===> {videObj=menuItemMarcas001, icodMaeMenu=14} | menuItemMarcas001
===> {videObj=menuItemMarcas002, icodMaeMenu=14} | menuItemMarcas002
===> {videObj=menuItemMarcas003, icodMaeMenu=14} | menuItemMarcas003
===> {videObj=menuItemMarcas005, icodMaeMenu=14} | menuItemMarcas005
如果我尝试访问 map.get(“icodMaeMenu”),它会生成错误,不会将整数转换为字符串,您应该参考在这种情况下。
答案 0 :(得分:0)
尝试将List<Map<Integer, String>> permisos
更改为List<Map<String, Object>> permisos
。看起来你的map的键是一个String,值可以是Integer或String。
答案 1 :(得分:0)
您不是将完全同质的对象存储到该地图中。我会告诉您,您至少要将String
作为密钥存储,但值可以是String
或Integer
。
您可以将Map
更改为List<Map<String, Object>>
。这具有明显的缺点,即您无法准确预测该映射中的确切内容,并且它会强制您根据您正在使用的字符串进行强制转换。
或者,您可以完全抛弃地图并创建某种包装对象,这些对象可以整齐地封装这两个对象,并且无需进行任何转换。
我不会写这个课,因为我不知道它的最佳名称是什么,但我可以给你你需要的HQL片段:
"select new Wrapper(opc.id.icodMaeMenu, opc.videObj)" +
// rest of append here...