如何使用命名查询返回 Map<key,value>?

Posted

技术标签:

【中文标题】如何使用命名查询返回 Map<key,value>?【英文标题】:How to return a Map<key,value> using named query? 【发布时间】:2013-06-03 06:13:58 【问题描述】:

我使用命名查询返回List&lt;?&gt;。但现在我有一个要求,我必须返回一个Map&lt;key,value&gt;,以便我可以使用密钥过滤重复项..

我有一个命名查询来返回产品名称的List&lt;String&gt;

<named-query name="FETCH_ACTIVE_PRODUCTS_NAME" >
    <query>SELECT product.name FROM Product product
           WHERE product.name LIKE :name
    </query>
</named-query>

另一个命名查询,用于获取产品描述的 List&lt;String&gt;

  <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&lt;Long,String&gt;。键包含产品 ID,值包含产品名称和描述。键不应包含重复值(即重复的产品 ID)..

现在我的问题是如何在命名查询中返回Map&lt;Long,String&gt;..我没有得到谷歌的帮助... 任何人都有关于如何做到这一点的想法..

【问题讨论】:

你在使用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

SSMMyBatis(九.查询语句专题)

有两个表A 和B ,均有key 和value 两个字段,如果B 的key 在A 中也有,就把B 的value 换为A 中对应的value

mybatis里怎么获取传进去的map集合中的key

EL表达式怎么获取Map的动态key?