gpt4 book ai didi

mybatis - 在 MyBatis 中,如何为 SelectProvider 指定结果类型

转载 作者:行者123 更新时间:2023-12-04 03:10:25 27 4
gpt4 key购买 nike

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

我使用的是MyBatis3.0

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

public class DataStatisticSqlBuilder extends SqlBuilder{ 

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

和一个映射器接口(interface)如下:

公共(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?

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

非常感谢。

最佳答案

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

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

在我的映射器 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。既然我已经发布了这个,请其他人发布一个更优雅的解决方案......:)

关于mybatis - 在 MyBatis 中,如何为 SelectProvider 指定结果类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7132184/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com