Подробнее:
Классы сущностей:
Код: Выделить всё
@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();
}
Класс DTO:
Код: Выделить всё
public record DataJoinDto(
Long id,
String name,
String type,
List addresses
) { }
public record AddressDto(Long id, String street) { }
Я пытался сопоставить вручную, но это не идеально:
Код: Выделить всё
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;
}
Я ищу более эффективный и потенциально более чистый способ создания сопоставления.
Подробнее здесь: https://stackoverflow.com/questions/785 ... g-data-jpa