我有一个带有四列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的每个元素。
List<Object[]>
List
shape
name
你可以让一个HQL返回List<FruitSearchTO>使用AliasToBeanResultTransformer:
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)。
FruitSearchTO
select new FruitSearchTO(f.shape, f.name)
查看有关HQL的《 Hibernate参考》一章,尤其是15.6 select子句一章。
select