这是我的第一篇文章,用我糟糕的英语......
我正在使用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?
也许使用一些注释,但我没有找到它们。
非常感谢。
答案 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。 现在我发布了这个,其他人可以发布一个更优雅的解决方案...... :)