在一个结果中使用HQL将相同@Entity的多个别名组合在一起

时间:2018-05-18 16:22:28

标签: hibernate hql

我有以下模式

@Entity
Class Fruit {
   String name;
}

@Entity
Class FruitAddition {
   @ManyToOne
   Basket basket;

   @ManyToOne
   Fruit fruit;

   String additionType;
}

@Entity
Class Basket {
   String owner;

   @ManyToMany   
   List<Fruit> fruits;

   @ManyToMany(mappedBy="basket")
   List<FruitAddition> fruitAdditions;
}

所以Basket是由Fruit列表(一个水果可以同时在多个篮子里)和FruitAddition列表组成的,这是几乎是Fruit的列表,但是购物篮中的每个水果都有与之关联的其他数据additionType

这似乎有效。

现在我想查询一篮子中的所有水果,因此我尝试将两个别名组合成一个结果,如下所示:

SELECT fruitAlone, fruitAdded 
FROM Basket bask 
JOIN bask.fruits fruitAlone 
JOIN bask.fruitAdditions addition 
JOIN addition.fruit fruitAdded
WHERE bask.owner = 'JOE'

然后将结果解释为List<Fruit>,因为fruitAlonefruitAdded都属于Fruit类型。

但我得到了java.lang.ClassCastException

这是如何正确完成的?

1 个答案:

答案 0 :(得分:1)

您只需收到List<Object[]>,其中第一个位置为fruitAlone,第二个位置为fruitAdded。像:

Query query = em.createQuery("SELECT fruitAlone, fruitAdded ...");
List<Object[]> results = query.getResultList();
for (Object[] obj : results) {
    Fruit fruitAlone= obj[0];
    Fruit fruitAdded = obj[1];
}