Hibernate Criteria API:在 Map 中对结果进行计数和分组

发布于 2024-09-04 03:33:32 字数 323 浏览 2 评论 0原文

Car 实体映射到包含 2 列的数据库表:IDColor

CarDao 有以下方法:

Map<Color, Integer> countByColor();

如果数据库表中有 3 辆红色汽车和 2 辆蓝色汽车,则该方法返回一个带有 2 个键(红色和蓝色)和相应计数(3 或 2)的地图)。

我想使用 Criteria API 来完成此操作。该方法会是什么样子?让我担心的是地图部分。

谢谢。

The Car entity is mapped to a database table with 2 columns: ID and Color.

CarDao has the following method:

Map<Color, Integer> countByColor();

If we have 3 red cars and 2 blue cars in the database table, the method returns a map with 2 keys (red and blue) and the corresponding count (3 resp. 2).

I would like to do this with the Criteria API. What would the method look like? It’s the Map part that worries me.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

煮酒 2024-09-11 03:33:32

我认为您所要求的内容对于 Criteria API 来说是不可能的(不做混乱的事情):API 中的任何方法都不会返回集合(在您的情况下将是一个地图),它们只返回列表。

所以你可以做的是编写你自己的 ResultTransformer ,它将返回一个单例列表,其第一个也是唯一的元素将是你的地图......但在我看来这会有点混乱。

类似的事情:

public class MyResultTransformer implements ResultTransformer {
    public Object transformTuple(Object[] tuple, String[] aliases) {
      return tuple;
    }
    public List transformList(List collection) {
      Map result = new LinkedHashMap(); // to preserve order
      // build the map from the collection
      ...
      return Collections.singletonList(result);
    }
}

要获取仅包含两个元素(颜色和计数)的元组,请使用 Criteria.setProjections() 方法。

I think what you are asking is not possible (without doing messy things) with the Criteria API : none of the method in the API returns a collection (that would be a map in your case), they only return Lists.

So what you could do is write your own ResultTransformer that would return a singleton list whose first and only element will be your map... but that would be a bit messy in my opinion.

something like that :

public class MyResultTransformer implements ResultTransformer {
    public Object transformTuple(Object[] tuple, String[] aliases) {
      return tuple;
    }
    public List transformList(List collection) {
      Map result = new LinkedHashMap(); // to preserve order
      // build the map from the collection
      ...
      return Collections.singletonList(result);
    }
}

to get tuples with only two elements (Color and count), use the Criteria.setProjections() method.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文