休眠HQL查询中的获取关系的获取关系

时间:2018-09-28 16:51:32

标签: java spring hibernate hql

我有实体客户,汽车:

@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 ",但是什么也没做。

我的目标是在尝试使用

时返回对象汽车,其中包含列表
"SELECT cars, cars.previousOwner FROM Customer u JOIN  u.cars cars JOIN u.cars.previousOwner previosOwner WHERE u.id IN :ids "

它返回了previousOwners的列表,但不在Car对象内部,而是作为返回列表中的第二个元素...

如何创建此类查询?谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

您可能想要一个(LEFTJOIN FETCH查询:

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

这将指示Hibernate加入cars.previousOwners关系,即使在默认情况下它被声明为使用惰性获取。如果您还想退回没有前任车主的汽车,请使用左联接提取。

有关更多信息,请参见docs