从JPA join获取Map结果的最优雅高效的方法

时间:2012-12-10 15:10:04

标签: jpa jpa-2.0

假设我有3个实体:

Car Place Visit

Visit表示Car访问Place时出现的情况,因此它会有到达时间,剩余时间和2个外键,一个到{ {1}}和Car一个。

在JPA中,PlaceVisit的关系@ManyToOneCar的关系@ManyToOne。 (因此,使用上述外键,Place可以进行多次访问,而Car可以进行多次访问。

让我们说我想知道访问所有Place s(或多个Car s的(唯一)Place列表,无关紧要,是什么获取Place的最佳方法是只在一个SQL查询中完成?

在普通的原生SQL中,我们只使用Map<Place, List<Car>>join,是否有一些JPA技巧可以优雅地实现这一目标?

我正在使用JPA 2.0(Hibernate 4.1)。

1 个答案:

答案 0 :(得分:0)

在番石榴的帮助下(但你很容易没有):

String jpql = "select distinct place, car from Visit visit"
              + " inner join fetch visit.car car"
              + " inner join fetch visit.place place"

List<Object[]> placeAndCars = em.createQuery(jpql).getResultList();
ListMultimap<Place, Car> result = ArrayListMultimap.create();
for (Object[] row : placesAndCars) {
    result.put((Place) row[0], (Car) row[1]);
}
return result;