是否可以在 MyBatis 中使用聚合函数

Posted

技术标签:

【中文标题】是否可以在 MyBatis 中使用聚合函数【英文标题】:Is it possible to use Aggregate functions in MyBatis 【发布时间】:2021-03-20 19:14:36 【问题描述】:

我是 MyBatis 的新手。据我所知,在从数据库中检索数据时,每一列都映射到一个属性值。那么是否可以使用 MyBatis 使用聚合函数。我们会将结果映射到什么属性?我到处搜索过,但是找不到关于 MyBatis 使用聚合函数的任何细节。如果有人可以帮忙,请。

【问题讨论】:

是的,当然可以。正如您所说的“每一列都映射到一个属性”。但是,这指的是结果集中的一列,而不是表。结果集列可能已经是聚合列。 @TheImpaler 好的。假设我们的数据库表中有名为 email 的列,称为讲师。然后我想按如下方式执行 SQL 查询 ///SELECT email, COUNT(*) AS counts FROM coach GROUP BY email;/// 所以在我们的 ResultSet 中,我们将有 2 列,一个称为电子邮件,另一个计数。所以现在的问题是我们如何映射这两列。我的 Instructor Pojo 课程中没有 count 属性。 如果您不想创建另一个 POJO,您始终可以将结果检索为java.util.Map<String, Object> 的列表,即List<Map<String, Object>> @TheImpaler 感谢您的回复。我试过了。但是当我尝试在返回的 List 中打印 Map 中的键/值时,我得到了 NullPointerException。 【参考方案1】:

结果集的每一列都映射到一个属性。因此,只需生成执行此操作的 SQL 语句即可。

例如:

<resultMap id="regionProfit" type="app.RegionProfitVO">
  <result property="region" column="region" />
  <result property="cnt" column="cnt" />
  <result property="profit" column="profit" />
</resultMap>

<select id="getRegionProfit" resultMap="regionProfit">
  select
    region,
    count(sales) as cnt,
    sum(revenue) - sum(expenses) as profit 
  from sales
  group by region
</select>

现在,您可以在 Java 代码中执行以下操作:

List<RegionProfitVO> rp = sqlSession.selectList("getRegionProfit");

【讨论】:

非常感谢。 :) 能否在主代码中展示如何检索这些结果?

以上是关于是否可以在 MyBatis 中使用聚合函数的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在相同的选择中重用聚合函数结果?

实体框架空间聚合函数

使用聚合函数从 MySql 表中删除?

SQL WHERE 子句中的聚合函数

(记录贴)Mybatis 数据库中用聚合函数 如何映射及赋值实体类

ElasticSearch 聚合函数