java - 如何将具有对象作为键的 Map 列表转换为 Map?
问题描述
我有一个存储库查询,它返回一个地图列表,如下所示:
@Query("SELECT new map(key(m), value(m) ) from User u join u.shopRoleMap m where u.usEmail = :email")
List<Map<Shop,Role>> findByUserEmail(String email);
用户映射如下:
@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
@JoinTable(name = "user_shop_role",
joinColumns = @JoinColumn(name = "user_fk"), inverseJoinColumns = @JoinColumn(name = "role_fk"))
@MapKeyJoinColumn(name = "shop_fk")
private Map<Shop, Role> shopRoleMap = new HashMap<>();
在我的服务中,我需要获取地图,Map<Shop,Role>
以便我可以相应地获取键和值。代码如下:
List<Map<Shop,Role>> shopRole= userRepository.findByUserEmail(email);
for (Map<Shop,Role> map : shopRole){
for (Map.Entry<Shop,Role> result : map.entrySet()){
System.out.println("The key is: "+result.getKey());
System.out.println("And the value is: "+result.getValue());
}
}
}
我得到的结果有些离奇,正如我所期望的result.getKey()
那样会给我Shop
作为关键。但是,我得到的键是 0 和 1。
The key is: 0
And the value is: Shop{id=54, sh_name='Frefdv', sh_icon='icon url', sh_description='Fashion Shop', sh_tag='metadata', uuid='99dba3d5-dfaa-446d-9649-b9b98f422f87', sh_enabled='N', created_at=2020-07-30T15:54:10, updated_at=2020-07-30T15:54:10, created_by='e0b009ef-27c2-405b-961a-86f199b15167', updated_by='e0b009ef-27c2-405b-961a-86f199b15167'}
The key is: 1
And the value is: Role{id=0, roleName='ADMIN'}
The key is: 0
And the value is: Shop{id=55, sh_name='fnhfh', sh_icon='icon url', sh_description='Fashion Shop', sh_tag='metadata', uuid='e3ccdbdf-aad2-43ba-8331-91b2c2c01853', sh_enabled='N', created_at=2020-07-30T15:54:23, updated_at=2020-07-30T15:54:23, created_by='e0b009ef-27c2-405b-961a-86f199b15167', updated_by='e0b009ef-27c2-405b-961a-86f199b15167'}
The key is: 1
And the value is: Role{id=0, roleName='ADMIN'}
如何将其转换List<Map<Shop,Role>>
为可以获取键值对的地图?
解决方案
有问题的 HQL 实际上是返回List<Map<String, Object>>
SELECT new map(key(m), value(m) ) from User u join u.shopRoleMap m where u.usEmail = :email
新地图的语法基本上需要值。因此,当将 key(m) 和 value(m) 传递给它时,key(m) 和 value(m) 将被视为 Map 值。地图的关键基本上是索引值(0,1,2,..)
您可以在 Hibernate 文档中阅读更多相关信息 - https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#hql-select-clause
因此,您应该将 HQL 替换为
SELECT entry(m) from User u join u.shopRoleMap m where u.usEmail = :email
这应该返回List<Map.Entry<Shop,Role>>可以迭代以获得正确的结果。
推荐阅读
- excel - Excel:如果单元格 B2 包含某个字符,则单元格 D2=E2 的值如果不是则 D2,那么如果我在 BX,我想增加到 E3?
- python - 定义 table_schema 时,无法将具有 NaN(或 None)值的 Pandas 数据帧插入 BigQuery 表
- python - /create/ 处的 NoReverseMatch
- angular - 如何解决 Angular 循环依赖
- python - 如何在继承文件的装饰器函数中获取python文件名
- lambda - Common Lisp: (NULL L) 应该是一个 Lambda 表达式
- javascript - 一般将 mustache 模板转换为 JSON 对象
- c - 转换为整数的 C 语句令人困惑?
- python - 如何循环遍历 XML 行?
- python - 防止 Dash 下拉菜单在多页应用程序中重置为默认值