3

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

我正在使用 MyBatis3.0

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

public class DataStatisticSqlBuilder extends SqlBuilder{ 

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

和映射器接口如下:

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?

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

非常感谢。

4

1 回答 1

4

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

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

在我的映射器 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/setter)

我现在可以像这样调用我的界面“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。现在我已经发布了这个,其他人可以发布一个更优雅的解决方案...... :)

于 2011-09-25T17:26:12.773 回答