我有一桌水果,有四列ID,名称,颜色,形状。

该表中的条目为:

1, apple, red, round
2, banana, yellow, long
3, tomato, red, round
4, orange, orange, round


现在,我将一个实体类Fruit映射到上表。

@Entity
@Table(name="fruit")
public class Fruit implements Serializable {

@Id
@Column(name="ID")
String id;

@Column(name="NAME")
String name;

@Column(name="COLOR")
String color;

@Column(name="SHAPE")
String shape;

//getters/setters goes here
}


在我的DAO类中,代码是:

String myQuery = "Select f.shape, f.name from Fruit f where f.shape = :shape";
Query query = this.em.createQuery(myQuery);
query.setParameter("shape", "round");


显而易见,在上面的查询中运行将返回3行。

我有一个简单的TO类FruitSearchTO

class FruitSearchTO
{
  String shape;
  String name;

  //getters/setters here
}


此TO符合我的查询返回的行。

但是在我的DAO中运行类似:

List<FruitSearchTO> fruitList = new ArrayList<FruitSearchTO>();
fruitList = query.getResultList();


抛出异常java.lang.ClassCastException:[Ljava.lang.Object;与FruitSearchTO不兼容]

我要去哪里错了,这有什么解决方案?

最佳答案

您正在使用的HQL将返回一个List<Object[]>,每个List元素是一个数组,其位置为0的shape和位置1的name

您可以使用List<FruitSearchTO>使HQL返回AliasToBeanResultTransformer

List fruitList = s.createQuery(
  "select f.shape as shape, f.name as name from Fruit f where f.shape = :shape;")
  .setParameter("shape", paramShape)
  .setResultTransformer( Transformers.aliasToBean(FruitSearchTO.class))
  .list();
FruitSearchTOdto = (FruitSearchTO) fruitList .get(0);


另外,如果FruitSearchTO具有适当的构造函数:,您也可以使用select new FruitSearchTO(f.shape, f.name)实现。

查看有关HQL的《 Hibernate参考》一章,尤其是15.6 The select clause一章。

09-03 20:45