是否可以在 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 中使用聚合函数的主要内容,如果未能解决你的问题,请参考以下文章