2017-01-17 4 views
1

Предположим, у меня есть объект, который выглядит следующим образом:запросов в зависимости от типа суб-объекта

@Entity 
public class Garage { 
    ... 
    @Column(unique = true, nullable = false) 
    private String garageId; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "garage") 
    private Set<Vehicle> vehicles = new HashSet<>(); 

    ... 
} 

Субъект транспортное средство выглядит следующим образом:

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class Vehicle{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private Long id; 


    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    @JoinColumn(name = "garage_id", referencedColumnName = "garageId", nullable = false) 
    private Garage garage; 

У меня есть два суб entitys, наследуемых от автомобиля они могут выглядеть так

@Entity 
public class Truck extends Vehicle { 
    ... 
} 


@Entity 
public class Motorcycle extends Vehicle { 
    ... 
} 

В Spring Data JPA, как бы я запрашиваю гаражные, который содержит мотоцикл? Также выкидывает другой вопрос, есть ли способ обеспечить соблюдение того, что у Гаража может быть только один из каждого суб-сущности? (Гараж может содержать 1 грузовик + 1 мотоцикл, но не более 1 конкретного транспортного средства)

+0

Так мы предположить, что грузовики и мотоциклы хранятся в одной таблице базы данных? Если да, то какой столбец в этой таблице указывает тип транспортного средства? – woemler

+0

Поскольку тип наследования 'TABLE_PER_CLASS', различные типы транспортных средств хранятся в отдельных таблицах. Поэтому самым простым способом было бы поставить запрос на «VehicleRepository» как «Список findAllDistinctGarages()». Однако, похоже, это не работает из-за проблемы разрешения типа с помощью Spring Data. Я поднял [проблему] (https://jira.spring.io/browse/DATAJPA-1046) с командой Spring Data, чтобы узнать, как это можно решить. Пример проекта доступен в [Github] (https://github.com/manish-in-java/stackoverflow-questions/tree/master/41701838). – manish

+0

Произошла ошибка в моем примере проекта. Посмотрите сейчас. 'Список findAllDistinctGarages()' on 'VehicleRepository' фактически работает. – manish

ответ

0

Я предполагаю, что у вас есть репозиторий для гаража в этом интерфейсе, определите следующий метод.

List<Garage> findByVehicles(Vehicle vehicle); 

Тогда, при условии, что у вас есть экземпляр Motorcyle называется мотоцикл, вы можете назвать это с

List<Garage> garagesWithMotorcyle = garageRepository.findByVehicles(motorcyle); 
+0

Есть ли способ сделать это без необходимости использования экземпляра суб-сущности? Мне кажется, что вам необязательно инициализировать экземпляр, который я не буду использовать после выполнения моего запроса. –

+0

Без экземпляра, как у вас будут данные для поиска? Я просто выйду на конечность и угадаю, что у вас есть идентификатор автомобиля, который будет минимальным объемом информации, необходимой для запроса гаража. Добавьте этот метод в свой репозиторий 'List findByVehiclesId (Long id);' –

Смежные вопросы