Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 将列表从JPA Query.getResultList()映射到自定义的_Hibernate_Jpa - Fatal编程技术网

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

Hibernate 将列表从JPA Query.getResultList()映射到自定义的,hibernate,jpa,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") Strin

我有一个有四列的水果,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行

我有一个简单的课程

class FruitSearchTO
{
  String shape;
  String name;

  //getters/setters here
}
这符合我的查询返回的行

但在我的DAO中,运行类似于:

List<FruitSearchTO> fruitList = new ArrayList<FruitSearchTO>();  
fruitList = query.getResultList();
List foultlist=new ArrayList();
结果列表=query.getResultList();
正在引发异常java.lang.ClassCastException:[Ljava.lang.Object;与FruitSearchTO不兼容]


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

您使用的HQL将返回一个
列表
,列表的每个元素都是一个数组,其中
形状
位于位置0,而
名称
位于位置1

您可以使用以下命令使HQL返回一个
列表

或者,如果
groutsearchto
有一个合适的构造函数:,您也可以通过
选择新的groutsearchto(f.shape,f.name)
来实现这一点


请看HQL的Hibernate参考章节,特别是章节。

在JPQL中,您有一个
新的
操作符,它允许您动态创建对象的实例,而不必是实体本身(就像您的情况一样,DTO不是实体)

如果您不想使用特定于供应商的解决方案,您可以使用
NEW
操作符,或者只需迭代生成的对象[],然后自己创建DTO


这些可能是您感兴趣的材料:,和。

谢谢哈维。。让我试试这个,然后再给你回复!!你能粘贴你先前的答案吗。我使用的是旧版本的Hibernate,它没有ResultTransformer方法。明白了!!谢谢由于版本问题,我无法验证上述答案。但是,迭代器版本确实有效@JamesDW感谢您的编辑,实际上似乎DTO不需要包含在映射中。
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);