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

Vic*_*cky 4 hibernate jpa

我有一个餐桌水果,有四列id,名称,颜色,形状.

表中的条目是:

1, apple, red, round
2, banana, yellow, long
3, tomato, red, round
4, orange, orange, round
Run Code Online (Sandbox Code Playgroud)

现在我创建了一个实体类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
}
Run Code Online (Sandbox Code Playgroud)

在我的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");
Run Code Online (Sandbox Code Playgroud)

很明显,运行上面的查询将返回3行.

我有一个简单的TO类FruitSearchTO

class FruitSearchTO
{
  String shape;
  String name;

  //getters/setters here
}
Run Code Online (Sandbox Code Playgroud)

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

但在我的DAO中运行如下:

List<FruitSearchTO> fruitList = new ArrayList<FruitSearchTO>();  
fruitList = query.getResultList();
Run Code Online (Sandbox Code Playgroud)

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

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

Xav*_*ica 6

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

你可以让一个HQL返回List<FruitSearchTO>使用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);
Run Code Online (Sandbox Code Playgroud)

或者,如果FruitSearchTO有一个合适的构造函数:,你也可以用它来实现select new FruitSearchTO(f.shape, f.name).

看看Hibernate参考一章HQL,特别是15.6 select条款章节.