2013-06-03 36 views
3

我正在使用命名查询来返回List<?>。但现在我有我不得不返回Map<key,value>,这样我可以使用键过滤重复的要求..如何使用命名查询返回地图<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> 

现在我必须返回一个带有key和value..key的Map<Long,String>,其中包含产品标识和包含产品名称和说明的值..密钥不应包含重复值(即,复制产品的ID)..

现在我的问题是我如何可以返回名为query..I've一个Map<Long,String>有没有从谷歌帮助... 任何一个有关于如何做到这一点的想法..

+0

你在使用spring-hibernate吗? – sanbhat

+0

是的,我使用春季休眠..你有任何想法如何做到这一点? – Lucky

+0

正如我所知,你必须通过循环来创建一个地图。因为在Hibernate查询中只返回列表。 – Ajit

回答

0

您可以在代码中执行此操作(调用方法),方法是循环访问列表并将值添加到地图中。

代码片断

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()); 
    } 
} 

你也可以把通过列表迭代,如果你有在很多地方使用它返回的产品对象本身内部地图的片段。

+0

是的,我有这个在我心中......这将是我的第二个解决方案,如果我没有得到一个好的..它似乎没有直接的方法来获取使用hibernate命名查询映射..im害怕它是否会慢因为我将这些查询用于搜索结果。 – Lucky

+0

@Lakshmanan - 因为hibernate将表格结果映射到对象形式,所以您的查询永远不会返回地图。除非你处理数百万行,否则你不需要关心性能(在这种情况下,你应该优化你的查询/数据) –

相关问题