Как получить Map <String, String> в качестве возвращаемого типа, используя аннотации mybatis - PullRequest
8 голосов
/ 09 февраля 2012

Используя аннотации в mybatis, можем ли мы иметь тип возвращаемого значения как карту нормалей?

В принципе, я хочу что-то вроде этого

@Select("select a, b from tableA")
public Map<String, String> getItems();

Где

mysql> select * from tableA;
+------+------+
| a    | b    |
+------+------+
| 1    | a    |
| 2    | b    |
| 3    | c    |
+------+------+

mysql> desc tableA;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| a     | varchar(10) | YES  |     | NULL    |       |
| b     | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

Попробовал это

@Select("select a, b from tableA")
@MapKey("a)
public Map<String, String> getItems();

но это дает ниже исключения

### Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'a' in 'class java.lang.String'

Ответы [ 3 ]

11 голосов
/ 15 апреля 2013

Вот как я могу это сделать, без дополнительного метода для преобразования Списка в Карту:

Вот класс сообщений

public class Message {
   private String code;
   private String message;
   GETTERS/SETTERS
}

Mapper

@Select("SELECT code, message FROM MESSAGES")
@MapKey("code")
public Map<String, Message> selectAllMessages();

К сожалению, невозможно создать карту

6 голосов
/ 10 февраля 2012

аннотация @Select("select a, b from tableA") вернет список карт, где каждая карта будет содержать одну запись.Вы можете написать конвертер для него.

public Map<Object,Object> mapFromListOfMap (List<Map> listOfMap ) {
  Map<Object,Object> map = new HashMap<Object,Object>();
  for(int i = 0; i < listOfMap.size(); i++) {
    Object key = (Object) listOfMap.get(i).get("a");
    Object value = (Object)listOfMap.get(i).get("b");
    map.put(key, value);
  }
  return map;
}

@Select("select a, b from tableA") вернет что-то вроде этого

List[0] -> Map ((key=>'a',value=>1),((key=>'b',value=>'a')))
List[1] -> Map ((key=>'a',value=>2),((key=>'b',value=>'b')))
List[2] -> Map ((key=>'a',value=>3),((key=>'b',value=>'c')))

, а функция mapFromListOfMap сделает это примерно так

Map ((key=>'1',value=>'a'),(key=>'2',value=>'b'),(key=>'3',value=>'c'))

надеюсь, это поможет:)

1 голос
/ 09 февраля 2012

@ MapKey (a) вернет карту с вашими результатами, помеченными

РЕДАКТИРОВАТЬ: Интересный результат.Не пытались использовать аннотации (вместо этого используйте мапперы), но AFAIK похоже, что она ожидает, что карта будет HashMap<someA, someB>, где someA имеет геттер и сеттер для «a» (например, getA, setA) ... вы даже можете использоватьтот же класс (HashMap

...