簡體   English   中英

休眠HQL查詢中的獲取關系的獲取關系

[英]Fetch relation of fetched relation in hibernate HQL query

我有實體客戶,汽車:

@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將cuz lazyinitialization設置為FALSE。

現在,我想獲取Cars及其previos所有者。 但我無法想到任何查詢,我嘗試使用:

"SELECT cars FROM Customer u JOIN u.cars cars JOIN u.cars.previousOwners previousOwners WHERE u.id IN :ids "但這沒有任何作用。

我想要的是當我嘗試使用時返回對象Car,其中包含list。

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

它返回了previousOwners的列表,但不在Car對象內部,而是作為返回列表中的第二個元素...

我如何創建這樣的查詢? 謝謝你的幫助!

您可能需要一個( LEFTJOIN FETCH查詢:

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

這指示Hibernate加入cars.previousOwners關系,即使在默認情況下它被聲明為使用惰性獲取。 如果您還想退回沒有前任車主的汽車,請使用左聯接提取。

有關更多信息,請參閱文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM