Как отобразить список объектов в один объект с уникальными столбцами, используя Streams API? - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть ситуация, когда мне нужно объединить две таблицы, которые отображаются в OneToMany.Я хочу знать, есть ли API в java 8 Stream, который может создавать одну сущность со столбцами из левой таблицы, являются обычными членами и правой таблицей в виде списка значений.

Пример данных:

Таблица 1

id    name 
1     abc

Таблица 2

id table1_id note  
1  1         qwerty
2  1         asdfgh
3  1         zxcvbn

Объединение этих двух таблиц.Я получаю что-то вроде этого

select name, note from table1 join table2 on table2.table1_id=table1.id;
abc qwerty
abc asdfgh
abc zxcvbn

Текущий выходной Java-объект: Список следующего класса

class NotesComments{
    String name;
    String notes;
}

Ожидаемый вывод - один Java-класс с несколькими примечаниями:

class NotesComments{
    String name;
    List<String> notes;
}

1 Ответ

0 голосов
/ 19 апреля 2019

Для этого вы можете использовать API сборщиков на основе Java - 8.

Вы можете увидеть этот пример

class Table2 {

    int id;
    int table1_id;
    String note;

    public Table2(int id, int table1_id, String note) {
        this.id = id;
        this.table1_id = table1_id;
        this.note = note;
    }


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getTable1_id() {
        return table1_id;
    }

    public void setTable1_id(int table1_id) {
        this.table1_id = table1_id;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }
}


class Table1 {
    private int id;
    private String name;

    Table1(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}

// Table3Final - Как вы упомянули в своем вопросе.

        Stream<Table1> table1List = Stream.of(new Table1(1, "abc"));
        Stream<Table2> table2List = Stream.of(new Table2(1, 1, "qwerty"),
                new Table2(2, 1, "asdfgh"),
                new Table2(3, 1, "zxcvbn"));

        Stream<Table3Final> table3GeneratedStream = table1List
                .flatMap(en -> table2List
                        .filter(table2Entry -> en.getId() == table2Entry.getTable1_id())
                        .collect(Collectors.groupingBy(Table2::getTable1_id, Collectors.mapping(Table2::getNote, Collectors.toList())))
                        .entrySet()
                        .stream()
                        .map(mapEntry -> new Table3Final(en.getName(), mapEntry.getValue())));

        /*System.out.println(table3GeneratedStream.count());*/


        table3GeneratedStream.forEach(entry -> {
            System.out.println("--------------Name---------------------------");
            System.out.println(entry.getName());
            System.out.println("----------------Notes-------------------------");
            entry.notes.forEach(System.out::println);
        });
...