spring - java.lang.ClassCastException:java.util.HashMap 无法在 Spring Boot 微服务中强制转换
问题描述
我正在尝试通过使用 spring data jpa 查询方法和 spring boot 来获取匹配的字符串字符。当我实现这个时,我收到如下错误,
java.lang.ClassCastException: java.util.HashMap cannot be cast to com.spacestudy.model.RoomInvestigatorMapping
我的服务文件包含以下代码,
public List<String> retrieveReponsiblePerson(String sEmpName)
{
List<RoomInvestigatorMapping> roomInvestigatorListResultObj = roomInvestigatorMappingRepositoryObj.findInvestigatorUsingName();
List<String> roomInvestigatorListReturnObj = new ArrayList<>();
for (RoomInvestigatorMapping result : roomInvestigatorListResultObj)
{
String subStringRoomInvestigator = result.employee.sEmpName;
if (subStringRoomInvestigator.contains(sEmpName))
{
List<String> obj = new ArrayList<>();
obj.add(subStringRoomInvestigator);
roomInvestigatorListReturnObj.addAll(obj);
}
}
return roomInvestigatorListReturnObj;
}
我正在从控制器文件中调用此方法,如下所示,
@GetMapping("/loadResponsiblePersons")
public List<String> loadResponsiblePersonsMethod(
@RequestParam(value = "sEmpName", required = true) String sEmpName)
{
return roomServiceObj.retrieveReponsiblePerson(sEmpName);
}
我的存储库文件包含以下内容,
@Repository
public interface RoomInvestigatorMappingRepository extends JpaRepository<RoomInvestigatorMapping, Integer>{
// find RoomInvestigatorMapping details by id
@Query(" select new map(emp.sEmpName as sEmpName, emp.nEmpId as nEmpId, "
+ "roomInvest.nRoomInvestigatorMappingId as nRoomInvestigatorMappingId, "
+ "roomInvest.nRoomAllocationId as nRoomAllocationId) "
+ "from RoomInvestigatorMapping as roomInvest Inner Join Employee as emp "
+ "on roomInvest.nInvestigatorId = emp.nEmpId ")
List<RoomInvestigatorMapping> findInvestigatorUsingName();
}
调用 API 时出现如下错误堆栈,
java.lang.ClassCastException: java.util.HashMap cannot be cast to com.spacestudy.model.RoomInvestigatorMapping
at com.spacestudy.services.RoomService.retrieveReponsiblePerson(RoomService.java:210) ~[classes/:na]
at com.spacestudy.controller.RoomController.loadResponsiblePersonsMethod(RoomController.java:59) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_141]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_141]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_141]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_141]
我的 RoomInvestigatorMapping.java 如下所示,
@Entity
@Table(name="roominvestigatormapping")
public class RoomInvestigatorMapping implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "roominvestigatormapping_seq_generator")
@SequenceGenerator(name = "roominvestigatormapping_seq_generator", sequenceName = "roominvestigatormapping_seq",allocationSize=1)
@Column(name="nroom_investigator_mapping_id",columnDefinition="serial")
public Integer nRoomInvestigatorMappingId;
@Column(name="nroom_allocation_id")
public Integer nRoomAllocationId;
@Column(name="ninvestigator_id")
public Integer nInvestigatorId;
@Min(0)
@Max(100)
@Column(name="npercentage_assigned")
public Integer nPercentageAssigned;
@Column(name="scomment")
public String scomment;
@ManyToOne(optional=true)
@JoinColumn(name="ninvestigator_id",referencedColumnName="nemp_id", insertable = false, updatable = false)
public Employee employee;
@ManyToOne(optional=true)
@JoinColumn(name="nroom_allocation_id", insertable = false, updatable = false)
public RoomDepartmentMapping roomDepartmentMapping;
}
是什么导致了这个错误?
解决方案
首先parameters
,让我们用你需要的RoomInvestigatorMapping
and创建构造函数Employee
,然后你应该添加这些行:
对于RoomInvestigatorMapping
public RoomInvestigatorMapping() {
// Empty constructor
}
public RoomInvestigatorMapping(String sEmpName, Integer nEmpId,
Integer nRoomInvestigatorMappingId,
Integer nRoomAllocationId) {
this.employee = new Employee(sEmpName, nEmpId);
this.nRoomInvestigatorMappingId = nRoomInvestigatorMappingId;
this.nRoomAllocationId = nRoomAllocationId;
}
对于员工
public Employee() {
// Empty constructor
}
public Employee(String sEmpName, Integer nEmpId) {
this.sEmpName = sEmpName;
this.nEmpId = nEmpId;
}
其次,让我们修改您的查询,例如:
@Query("SELECT new com.spacestudy.model.RoomInvestigatorMapping(emp.sEmpName as sEmpName, emp.nEmpId as nEmpId,"
+ " roomInvest.nRoomInvestigatorMappingId as nRoomInvestigatorMappingId,"
+ " roomInvest.nRoomAllocationId as nRoomAllocationId) "
+ "FROM RoomInvestigatorMapping as roomInvest "
+ "INNER JOIN Employee as emp "
+ "ON roomInvest.nInvestigatorId = emp.nEmpId ")
List<RoomInvestigatorMapping> findInvestigatorUsingName();
推荐阅读
- sql - Simple recursive query in Oracle
- hibernate - 如何将自定义查询结果转换为 JAVA POJO 类
- java - 无法更改 JDK 位置,每当我更改 JDK 的位置时,它都会使用嵌入式 JDK
- excel - 将键分配给宏
- sql - Normalization of multiple similar tables
- java - Codenameone Facebook 通过模拟器分享
- java - 如何使用 Selenium 和 WebDriver 从表中识别和打印数据列表?
- laravel-5 - 在laravel中对json数组进行分页
- python - 尝试在 python 中构建 opencv 时出现问题:“-- 配置不完整,发生错误”
- javascript - 多卡翻转jQuery