如何使用命名查询返回 Map<key,value>?
Posted
技术标签:
【中文标题】如何使用命名查询返回 Map<key,value>?【英文标题】:How to return a Map<key,value> using named query? 【发布时间】:2013-06-03 06:13:58 【问题描述】:我使用命名查询返回List<?>
。但现在我有一个要求,我必须返回一个Map<key,value>
,以便我可以使用密钥过滤重复项..
我有一个命名查询来返回产品名称的List<String>
,
<named-query name="FETCH_ACTIVE_PRODUCTS_NAME" >
<query>SELECT product.name FROM Product product
WHERE product.name LIKE :name
</query>
</named-query>
另一个命名查询,用于获取产品描述的 List<String>
,
<named-query name="FETCH_ACTIVE_PRODUCTS_DESC" >
<query>SELECT product.desc FROM Product product
WHERE product.desc LIKE :desc
</query>
</named-query>
另一个按产品名称获取产品 ID 的命名查询
<named-query name="FETCH_ACTIVE_PRODUCTS_ID_BY_NAME" >
<query>SELECT product.id FROM Product product
WHERE product.name LIKE :name
</query>
</named-query>
现在我必须返回一个带有键和值的Map<Long,String>
。键包含产品 ID,值包含产品名称和描述。键不应包含重复值(即重复的产品 ID)..
现在我的问题是如何在命名查询中返回Map<Long,String>
..我没有得到谷歌的帮助...
任何人都有关于如何做到这一点的想法..
【问题讨论】:
你在使用spring-hibernate吗? 是的,我正在使用 spring-hibernate..你知道如何做到这一点吗? 据我所知,您必须通过循环来创建地图。因为在 Hibernate 中查询只返回列表。 【参考方案1】:您可以在代码中执行此操作(调用方方法),方法是遍历列表并将值添加到地图中。
代码sn-p
List <Product> products = new ArrayList<Product>();
// update products list by fetching from db.
Map<Long, String> productDesc = new HashMap<Long, String>();
for(Product prod : products)
if(productDesc.get(prod.getId() == null)
productDesc.put(prod.toString());
如果你必须在很多地方使用它,你也可以把遍历列表并返回地图的sn-p放在产品对象本身中。
【讨论】:
是的,我有这个想法..如果我没有得到一个好的解决方案,这将是我的第二个解决方案..似乎没有使用休眠命名查询获取地图的直接方法。 .我担心它是否会降低性能..因为我将这些查询用于搜索结果.. @Lakshmanan - 因为 hibernate 将您的表格结果映射到对象形式,所以您的查询永远不会返回映射。除非您处理数百万行(在这种情况下您可能应该优化查询/数据),否则您无需担心性能【参考方案2】:请看这篇文章。可能这会对你有所帮助。对于重复删除,您可以在另一个命名查询中尝试嵌套查询。
how to return Map<Key, Value> with HQL
【讨论】:
以上是关于如何使用命名查询返回 Map<key,value>?的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis,返回Map的时候,将Map内的Key转换为驼峰的命名
使用mybatis返回一个Map时,如果sql语句查询没有记录,如何让sql中的字段为Map中的key
有两个表A 和B ,均有key 和value 两个字段,如果B 的key 在A 中也有,就把B 的value 换为A 中对应的value