繁体   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