Могу ли я отобразить результат запроса hibernate / jpa на класс, который не является сущностью? - PullRequest
0 голосов
/ 29 сентября 2019

Я экспериментирую со Springboot, у меня есть несколько сущностей с несколькими очень похожими свойствами, например: Сущность "Автомобиль" имеет свойства модели и цены, как и модель "Мотоцикл".Я хотел бы использовать класс для определения только тех общих атрибутов, класс "Автомобиль" с моделью свойств и ценой.

Другими словами:

Car                             Motorcicle                             Vehicle
price                              price                                price
model                              model                                 model
year                              year
color                              color
fuel_type                         fuel_type
... 30 more properites                ...30 more properties

Я хочу использовать автомобиль дляотобразить результат поиска объединения SQL между таблицами Car и Motorcycle.

public interface ImovelRepositorio extends JpaRepository<Vehicle, Long> {

      @Query(value = "here select query with union between car and motorcycle", nativeQuery = true)
  List<Vehicle> searchVehicle();

}

Здесь класс Vehicle - это обычный класс без каких-либо аннотаций.Я получаю сообщения о том, что тип транспортного средства не является управляемым.Конечно, мой репозиторий не имеет смысла, я ожидал эту ошибку.Но как мне достичь того, чего я хочу?

Когда я выполняю объединение, я не получаю список моделей, а получаю список из одной или нескольких моделей.Я хочу создать класс, чтобы «объединить» результат поиска.

Ответы [ 3 ]

0 голосов
/ 30 сентября 2019

FluentJPA предлагает решение для этого случая.

0 голосов
/ 30 сентября 2019

Я вижу, что вы используете SpringData JPA.В JPQL вы можете реализовать это, написав select new fully.qualified.name.of.your.Class(field1, field2) from Entity и т. Д. У вас должен быть правильный конструктор в вашем классе fully.qualified.name.of.your.Class.Этот класс НЕ ДОЛЖЕН быть @Entity - это может быть любой обычный POJO или что-то еще, что вы хотите.

Однако я вижу, что вы также используете собственный запрос.Для нативного запроса это не сработает - вам придется объявить тип возвращаемого значения как List<Object[]> и выполнить сопоставление с ним самостоятельно или использовать @NamedNativeQuery с @SqlResultSetMapping.Но вам действительно нужен нативный запрос там?

0 голосов
/ 29 сентября 2019

Вы можете использовать @MappedSuperClass, где Vehicle может быть отображенным суперклассом.Остальные классы могут просто расширять его.Примерно так:

Суперкласс:

@MappedSuperClass
class Vehicle {
// constructor, getters, setters 
}

Классы сущностей:

@Entity
class Car extends Vehicle {
// constructor, getters, setters 
}

@Entity
class MotorCicle extends Vehicle {
// constructor, getters, setters 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...