在MyBatis中,如何指定SelectProvider的结果类型

时间:2011-08-20 13:54:39

标签: mybatis resulttype

这是我的第一篇文章,用我糟糕的英语......

我正在使用MyBatis3.0

在查询中,我使用SqlBuilder的方法如下:

public class DataStatisticSqlBuilder extends SqlBuilder{ 

public String getDataQtyListSql(Map<String, Object> map){

和mapper界面如下:

public interface DataStatisticMapper {

@SelectProvider(type=DataStatisticSqlBuilder.class, method="getDataQtyListSql")

public List<Map<String, Object>> getDataQtyList(@Param("groups")
List<DataStatisticSqlBuilder.Group> groups, @Param("quatity") Integer quatity, @Param("struct") Struct struct); 
}

当我打电话

session.getMapper(DataStatisticMapper.class).getDataQtyList(...some parameters)

我在控制台中输出了以下结果:

<==    Columns: PROJECT, PRJ_COUNT, TAR_COUNT, SITE_COUNT, PARAM_COUNT
<==        Row: project A, 1, 1, 0, 0 
<==        Row: project B, 1, 1, 0, 0

根据以上输出,预期结果应为List [Map,Map,...],但实际结果为[null,null]。似乎结果未映射到HashMap。如何在此查询中将结果类型设置为HashMap?

也许使用一些注释,但我没有找到它们。

非常感谢。

1 个答案:

答案 0 :(得分:3)

我有同样的[null,null]试图处理一些动态生成的sql。 mybatis手册提到了SqlBuilder,但没有提示如何使用sql。我认为你的问题可以通过添加@Results和@Result注释来解决。如果结果列始终相同,那么这应该有效,例如参见@Results example

的末尾

在我的使用中,我不知道哪些列,所以这里是我最终做的。

在我的mapper xml文件中:

  <update id="executeUpdate">
    ${stmt}
  </update>

  <select id="executeQuery" resultType="java.util.Map">
    ${stmt}
  </select>

$ {}而不是#{}会按原样插入字符串而不将其视为jdbc?参数。这是此解决方案的关键。在你的情况下,这将是@SelectProvider返回的sql,你将添加一个@Param(“stmt”)来传递实际的sql来运行。

在与xml文件对应的mybatis界面中:

void executeUpdate(DynamicSqlDao.ParameterObject po);
List<Map<String,Object>> executeQuery(DynamicSqlDao.ParameterObject po);

ParameterObject是一个简单的bean:

@Data
public class ParameterObject
{
    String stmt;
    Map<String,Object> param;
}

(@ Data来自Project Lombok并生成getter / setters)

我现在可以像这样调用我的界面“dao”:

Map<String,Object> pmap = new HashMap<String,Object>();
pmap.put("apa", "banan");
ParameterObject po = new ParameterObject();
po.stmt = stmt;
po.param = pmap;
List<Map<String,Object>> result = dao.executeQuery(po);

ParameterObject可能只是一个带有sql语句保留名称的Map。 现在我发布了这个,其他人可以发布一个更优雅的解决方案...... :)