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

我有一个带有四列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将返回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);

或者,如果FruitSearchTO具有合适的构造函数:,您也可以使用实现此目的select new FruitSearchTO(f.shape,

f.name)

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

select子句一章。

以上是 从JPA Query.getResultList()到自定义TO的映射列表 的全部内容, 来源链接: utcz.com/qa/423244.html

回到顶部