Преобразовать хэш-карту в строку - PullRequest
0 голосов
/ 19 мая 2018

Я работаю над устаревшей базой данных, в которой изменение схемы таблицы невозможно.Большинство записей уникальны, но есть несколько повторяющихся записей.По этой причине я изменил интерфейс RecordRepository.java для выполнения @Query с map ().В противном случае JPA вернет те же данные, если считает, что это та же запись.

RecordRepository.java:

@Query("select new map(field1 as field1, field2 as field2) from Record where year = ?1")
List<Record> findByYear(String year);

RecordController.java:

@RestController
public class RecordController {
    @Autowired
    private RecordRepository recordRepository;

    @RequestMapping(value = "/record/{year}", method = RequestMethod.GET)
    public List<Record> recordByYear(@PathVariable("year") String year) {
        List<Record> l = recordRepository.findByYear(year);

        System.out.println(l.getClass());
        System.out.println(l.get(1967));

        return l;
    }
}

Вывод изgetClass() - это class java.util.ArrayList.Печать элемента 1967 из ArrayList - {field1=2018-01-15, field2=201801}.

Но при попытке получить строковое значение field1 с помощью String tmp_r = l.get(1967).getField1() я получаю ошибку java.util.HashMap cannot be cast to Record.

Я пробовал различныепредложения от SO.Моя голова кружится, я должен пропустить что-то простое объяснение этому.

С уважением, Клаус

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Ответ Даниэля и комментарий STaefi привели меня в правильном направлении.Решение оказалось довольно простым.Моя ошибка может быть объяснена тем фактом, что я давно с этим работал.Я изменил тип возврата в интерфейсе с List на List.

RecordRepository.java:

List<HashMap<String, Record>> findByYear(String year);

RecordController:

List<HashMap<String, Record>> l = recordRepository.findByYear(year);
System.out.println(l.get(1967).get("field1"));

даст мне значение field1 имеет.

0 голосов
/ 19 мая 2018

Ну, l.getClass() - это ArrayList, но это не значит, что все его элементы - это Record-s (возможно, приведения были сделаны где-то еще).

Когда вы вызываете l.get(1967), результирующий элементHashMap (верно?), так что, возможно, вы можете сначала проверить фактический тип выражения l.get(1967).

Если карта проиндексирована с помощью Strings, то String tmp_r = l.get(1967).get("field1") напечатает ваше поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...