MyBatis使用动态查询,例如count(*)或新列中的数据

时间:2014-08-07 01:54:14

标签: java postgresql java-ee mybatis

假设我有user_partner_table

id, user_id, partner_id, app_completed, user_name, partner_name
1, 2345, 232, t, sam, A&C Bank
2, 2345, 121, f, sam, M&M Bank
3, 4324, 123, t, tom, DC Bank
4, 4324, 121, t, tom, M&M Bank
5, 1211, 134, f, harry, USBank
6, 1211, 111, t, harry, creditunion

在我的DAO课程中,我有id,user_id,partner_id,app_completed,user_name,partner_name

的getter和setter

如果我想根据可用的列获取任何数据,我可以编写查询并在查询中生成resultType="UserPartnerDAO"并将结果设为ArrayList<UserPartnerDAO>

但是,如果我想运行使用聚合数据生成不同数据列的查询,该怎么办?示例:

假设我是user_id,count_of_app_completed基本上每个用户完成了多少个应用程序,因此它是group by。现在没有列名"count_of_app_completed" 所以,如果我在我的UserPartnerMapper.xml中放入以下查询

<select id="aggregateQuery" resultType="UserPartnerDAO">
  SELECT user_id,
         COUNT(CASE WHEN completed THEN 1 END) count_of_app_completed
    FROM user_partner_table
GROUP BY user_id
</select>

如何同时访问动态列? 如何访问所有列? 将resultType设置为“UserPartnerDAO”或结果类型是否为其他内容是否正确?

1 个答案:

答案 0 :(得分:0)

您需要beanclass)映射到汇总查询中的数据。

具体取决于您使用UserPartnerDAO课程的其他内容,您可以在那里潜行。只要它具有别名为count_of_app_completed的getter / setter, MyBatis 就会很高兴。根据您使用该课程的其他内容,可能还有其他一些事情会对额外的字段感到高兴。 (从一般代码组织的角度来看,它有点混乱。)

在这种情况下 - 以及我经常做的事情 - 您可以创建一个特定的类来保存该查询的结果(如果您有几种不同类型的查询,可能会创建几个不同的字段)。 Mybatis 只需要一个地方来存储信息 - 也就是说,一个具有正确的getter和setter的对象。如果并非所有这些都适用于该特定查询,那么(对于 Mybatis )并不重要。

类似地,我有时会创建一个InputBean类来存储查询中可能需要的各种项目以动态交织它(即表格的名称或LIMIT要在查询中使用的值)。我可以在多个查询中使用相同的InputBean对象,并且在每种情况下仅使用一些成员。