В MyBatis, Как указать тип результата для SelectProvider - PullRequest
2 голосов
/ 20 августа 2011

Это мой первый пост, использующий мой плохой английский ...

Я использую 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, ...], но фактический результат - [ноль ноль].Кажется, результат не сопоставлен с HashMap.Как установить тип результата в HashMap по этому запросу?

Возможно, используйте некоторые аннотации, но я их не нашел.

Большое спасибо.

1 Ответ

3 голосов
/ 25 сентября 2011

Я получил то же самое [null, null], пытаясь обработать некоторый динамически сгенерированный sql.В руководстве mybatis упоминается SqlBuilder, но не предлагается, как использовать sql.Я думаю, что ваша проблема может быть решена путем добавления аннотаций @Results и @Result.Это должно работать, если столбцы результатов всегда одинаковы, см., Например, в конце @ Пример результатов

В моем случае я не буду знать, какие столбцы есть, вот чтоВ конце концов я это сделал.

В моем xml-файле mapper:

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

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

$ {} вместо # {} вставит строку как есть и не будет обрабатывать ее как jdbc?параметр.Это ключ к этому решению.В вашем случае это будет sql, возвращаемый @SelectProvider, и вы добавите @Param ("stmt") для передачи фактического sql для запуска.

В интерфейсе mybatis, соответствующем xml-файлу:

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

ParameterObject - это простой компонент:

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

(@ Данные из Project Lombok и генерирует геттер / установщики)

IТеперь я могу назвать мой интерфейс "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.Теперь, когда я опубликовал это, может кто-нибудь еще, пожалуйста, опубликуйте более элегантное решение ...:)

...