如何修复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对象
- 先在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保持不变 }
- 修改仓库层查询语句,使用
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(); }
- 修复控制层的变量名错误:
@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
相关产品推荐
相关产品推荐

