Вы фактически делаете проекцию с вашим выбором, который не возвращает никакого конкретного объекта, но кортеж , который является массивом объектов, которые вы выбираете в своем запросе. Каким бы способом ни был создан JSON, нет имен, есть только значения.
Вам необходимо создать DTO для хранения значений, которые вы хотите передать именами в вашем JSON.
Минимальный пример, имеющий простую сущность, такую как:
@Entity
@Getter
@RequiredArgsConstructor
public class TestClass {
@Id
@GeneratedValue
private Long id;
@NonNull
private String a,b,c;
}
и готовы передать - например - только a
& b
там может быть DTO вроде:
@RequiredArgsConstructor
public class TupleDto {
@NonNull
private String a,b;
}
а в вашем случае какой-то PriceListDetailsDto
хранилище может быть объявлено как:
public interface TestClassRepository extends CrudRepository<TestClass, Long> {
@Query(value="SELECT new org.example.TupleDto(tc.a, tc.b) FROM TestClass tc")
List<TupleDto> fetchAB();
}
ПРИМЕЧАНИЕ : выше используется оператор new
и полный путь к конструктору сущности.
Таким образом, репозиторий Spring знает, как назначать выбранные поля, и при создании JSON из этого DTO получаются поля с именами (имена в DTO).
Оператор new
в JPQL просто вызывает new
в java. Таким образом, любые данные строки a,b,c
могут использоваться для создания объекта Java с конструктором класса этого объекта, принимающим то же количество параметров и типы (и в том же порядке ) так liie new MyEntityObject(a,b,c)
.
ПРИМЕЧАНИЕ. ТАКЖЕ : в этом простом случае исходная сущность могла бы использоваться как DTO, если бы она была изменена, чтобы разрешить нулевое значение в c и добавить соответствующий конструктор. В вашем случае, когда ваш кортеж состоит из множества таблиц, вам нужно создать DTO для хранения этих значений.