当前位置: 首页 > 面试题库 >

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

司空学智
2023-03-14
问题内容

我有一个带有四列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子句
一章。



 类似资料:
  • 我有一个要求,在那里我将从2列像天和月的数据,但我想把它转换成一个日期对象,并把它设置成我的bean类。 这是否可能不添加属性到java类? 我尝试检查自定义结果处理程序,但示例不够清晰。在从select方法返回之前,是否有钩子来运行某种自定义处理程序?

  • 例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?

  • 问题内容: 我将Hibernate用作我们的对象关系映射,并为晦涩的数据库使用了自定义方言。 我从该数据库中检索的实体具有一列,因此: 数据库将此列定义为数字,精度为9,小数位数为3。 我可以看到Hibernate生成的用于检索数据的SQL,当我使用数据库查询工具执行相同的查询时,它为GROSS_WEIGHT列返回“ 9.68”。 但是,在由Hibernate检索的Entity中,“ grossW

  • 我使用Hibernate作为我们的对象关系映射,为一个模糊的数据库使用自定义方言。 我从这个数据库检索的实体有一个列,因此: 数据库将此列定义为数字,精度为9,刻度为3。 我可以看到Hibernate生成的检索数据的SQL,当我使用数据库查询工具执行相同的查询时,它会返回GROSS_WEIGHT列的9.68。 但是,在Hibernate检索到的实体中,“GrossWight”字段包含值“10”,其

  • 我有一个Spring Boot应用程序,我使用RestTemboard调用Rest API,我收到以下JSON格式的响应: 数组“data”中的单个元素几乎没有不同的结构(上面的两个例子),我想用单个元素映射不同的类类型,这取决于元素“type”的值。 例如,值“type1”应该映射到类类型为“type1”的对象,依此类推。 我创建了如下类:MyResponse: 数据: 类型1: 类型2: 如何

  • 以下是我的上下文:我使用byteBuddy动态生成一个类,该类根据外部配置将一个对象转换为另一个对象。我遇到了一些问题,我想找到一个替代方案,这就是我发现MapStruct的方式。 因此,我试图构建简单的映射器,我想知道是否有可能自定义注释以添加转换函数。例如,我想要: 在mapper实现中,我会有如下内容: 如果有人能帮我做到这一点,我将不胜感激,这将节省我很多时间。 提前谢谢。