我有实体客户,汽车:
@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对象内部,而是作为返回列表中的第二个元素...
如何创建此类查询?谢谢你的帮助!
答案 0 :(得分:0)
您可能想要一个(LEFT
)JOIN FETCH
查询:
SELECT cars FROM Customer u
JOIN u.cars cars
JOIN FETCH cars.previousOwners
WHERE u.id IN :ids
这将指示Hibernate加入cars.previousOwners关系,即使在默认情况下它被声明为使用惰性获取。如果您还想退回没有前任车主的汽车,请使用左联接提取。
有关更多信息,请参见docs。