Отношение извлечения извлеченного отношения в Hibernate HQL-запросе - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть лицо, Клиент, Автомобиль:

@Entity
public class Customer{
  List<Car> cars;
  ...
}

@Entity
public class Car{
  List<Customer> previousOwners;
  ...
}

В основном Клиент может арендовать несколько автомобилей, и Автомобили помнят предыдущих владельцев.

Оба объекта имеют больше отношений, и яЯ опускаю их.

Теперь хочу получить все автомобили Клиента:

public List<Car> getCars(int customerId) {
    List<Car> cars= new ArrayList<>();
    Transaction tx = null;
    try (Session session = HibernateUtil.getSessionFactory().openSession()) {
        tx = session.beginTransaction();
        cars= (List<Car>) session.createQuery("SELECT cars FROM Customer u JOIN  u.cars cars WHERE u.id IN :ids ").setParameter("ids", customerId).list();
    } catch (HibernateException e) {
        if (tx != null) tx.rollback();
        e.printStackTrace();
    }
    return cars;
}

Это вернет список автомобилей, мне нужно использовать JOIN, потому что lazyinitialization установлено в FALSE.

Теперь я хочу получить Автомобили и их прежних владельцев.Но я не могу придумать ни одного запроса, я попытался использовать:

"SELECT cars FROM Customer u JOIN u.cars cars JOIN u.cars.previousOwners previousOwners WHERE u.id IN :ids ", но это ничего не дало.

Я собираюсь вернуть объект Car со спискомвнутри , когда я пытался использовать

"SELECT cars, cars.previousOwner FROM Customer u JOIN  u.cars cars JOIN u.cars.previousOwner previosOwner WHERE u.id IN :ids "

, он возвращал список предыдущих владельцев, но не внутри объекта Car, а как второй элемент в возвращаемом списке ...

Как я могусоздать такой запрос?Спасибо за помощь!

1 Ответ

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

Вы, вероятно, хотите запрос (LEFT) JOIN FETCH:

SELECT cars FROM Customer u
JOIN u.cars cars
JOIN FETCH cars.previousOwners
WHERE u.id IN :ids

Это указывает Hibernate присоединиться к отношению cars.previousOwners, даже если по умолчанию объявлено использование отложенной выборки.Используйте выборку левого соединения, если вы также хотите вернуть автомобили без предыдущих владельцев.

См. документы для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...