You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Cannot create TypedQuery多返回值与指定结果类型不匹配错误

错误原因

你触发报错的核心原因是JPQL查询的返回类型和指定的接收类型不匹配:
你编写的查询语句SELECT h.title, h.description, h.price FROM House h WHERE h.id = :id返回的是由这3个字段值组成的Object[]数组,并非House实体对象,调用createQuery时传入House.class作为结果类型就会触发该报错。
同时你当前的查询逻辑也不符合需求:你需要返回除city外的所有House属性,但现有查询只查了3个字段,缺失了id、phoneNumber两个属性。另外控制层代码存在变量名错误,你定义的变量是house,但返回时写的是property,会编译失败。

修复方案

这里提供两种常用的可行方案:

方案1:使用构造器表达式直接返回封装好的House对象

  1. 先在House类中新增对应参数的构造方法,必须同时保留无参构造(JPA实体强制要求):
public class House {
    @Id
    @GeneratedValue
    private long id;
    private String title;
    private String description;
    private String city;
    private double price;
    private String phoneNumber;

    // 新增:除city外所有属性的构造方法
    public House(long id, String title, String description, double price, String phoneNumber) {
        this.id = id;
        this.title = title;
        this.description = description;
        this.price = price;
        this.phoneNumber = phoneNumber;
    }

    // 必须保留无参构造
    public House() {}

    // 原有getter、setter保持不变
}
  1. 修改仓库层查询语句,使用NEW关键字指定构造器封装结果:
public House findByIdButCity(long id) {
    // 注意将下面的`com.yourpackage.House`替换为你项目中House类的实际全限定类名
    String jpql = "SELECT NEW com.yourpackage.House(h.id, h.title, h.description, h.price, h.phoneNumber) FROM House h WHERE h.id = :id";
    return em.createQuery(jpql, House.class)
            .setParameter("id", id)
            .getSingleResult();
}
  1. 修复控制层的变量名错误:
@GetMapping("{id}")
public ResponseEntity<House> getAttributesButCityById(@PathVariable long id) {
    House house = houseRepository.findByIdButCity(id);
    if (house == null)
        return ResponseEntity.notFound().build();
    else
        return ResponseEntity.ok(house); // 把property改为house
}

方案2:先查完整实体再清空不需要的字段(实现更简单)

如果不需要严格限制SQL查询的返回字段,直接查询完整House对象后把city字段设为空即可,不需要修改类结构:

// 仓库层代码
public House findByIdButCity(long id) {
    House house = em.find(House.class, id);
    if (house != null) {
        house.setCity(null); // 清空不需要返回的city字段
    }
    return house;
}

控制层同样修改变量名即可。


内容的提问来源于stack exchange,提问作者JRobi17X

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:57:04