Сопоставление кортежа из результата собственного запроса с DTO в Spring Data JPAJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Сопоставление кортежа из результата собственного запроса с DTO в Spring Data JPA

Сообщение Anonymous »

Я пытаюсь сопоставить результаты собственного SQL-запроса, выполненного через Spring Data JPA, с классом объекта передачи данных (DTO). Запрос извлекает данные из двух связанных таблиц: Data и Address.
Подробнее:
Классы сущностей:

Код: Выделить всё

@Entity
public class Data {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;

private String name;

@Column(length = 500)
private String description;

private String type;

private LocalDateTime date;

@OneToMany(fetch = FetchType.LAZY)
private List addresses;

}

Код: Выделить всё

@Entity
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;

private String street;

@ManyToOne(fetch = FetchType.LAZY)
private Data data;

}
Репозиторий данных:

Код: Выделить всё

public interface DataRepository extends CrudRepository {
@Query(value = """
select d.id, name, type, a.id as addressid, a.street as street from data d inner join address a ON d.id = a.data_id
""", nativeQuery = true)
List getDataWithList();
}
Этот интерфейс определяет пользовательский запрос с именем getDataWithList, который использует собственный запрос SQL для получения данных из таблиц данных и адресов с помощью внутреннего соединения.
Класс DTO:

Код: Выделить всё

public record DataJoinDto(
Long id,
String name,
String type,
List addresses
) { }

public record AddressDto(Long id, String street) { }
Я хочу сопоставить элементы списка, возвращаемого запросом, с экземплярами класса DataJoinDto. Мне нужно использовать НАТИВНЫЕ ЗАПРОСЫ.
Я пытался сопоставить вручную, но это не идеально:

Код: Выделить всё

    public List mapTuplesToDataJoinDtos(List tuples) {
List dataJoinDtos = new ArrayList();
for (Tuple tuple : tuples) {
Long dataId = (Long) tuple.get("id");
String dataName = (String) tuple.get("name");
String dataType = (String) tuple.get("type");

List addressDtos = new ArrayList();
for (Tuple addressTuple : tuples) {
if (dataId.equals(addressTuple.get("id"))) {
Long addressId = (Long) addressTuple.get("addressid");
String street = (String) addressTuple.get("street");
addressDtos.add(new AddressDto(addressId, street));
}
}
dataJoinDtos.add(new DataJoinDto(dataId, dataName, dataType, addressDtos));
}
return dataJoinDtos;
}
При таком подходе список кортежей выполняется дважды, что приводит к временной сложности O(n^2), что может быть неэффективно для больших наборов данных.
Я ищу более эффективный и потенциально более чистый способ создания сопоставления.

Подробнее здесь: https://stackoverflow.com/questions/785 ... g-data-jpa
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»