映射列表从JPA Query.getResultList()到自定义的TO

时间:2011-10-31 09:50:01

标签: hibernate jpa

我有一个包含四列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不相容]

我哪里出错了,解决方法是什么?

2 个答案:

答案 0 :(得分:6)

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

您可以使用AliasToBeanResultTransformer

使HQL返回List<FruitSearchTO>
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 Reference章节,特别是15.6 The select clause章节。

答案 1 :(得分:4)

在JPQL中你有一个NEW运算符,它允许你即时创建一个对象的实例,它不必是一个实体本身(就像你的情况一样 - 一个DTO不是一个实体)。

如果您不想使用特定于供应商的解决方案,您可以使用NEW运算符,或者只是迭代生成的Object []并自己创建DTO。

这些材料可能是您感兴趣的材料:How can I avoid the creation of superfluous entities?a bit about the NEW operator