java-ClassCastException:类 org.hibernate.metamodel.model.domain.internal.EntityTypeImpl 无法转换为类 org.hibernate.query.OutputableType

问题描述 投票:0回答:1

尝试在 Spring Data JPA 应用程序中使用 Jakarta EntityManager 运行 StoredProcedure 时,出现

java.lang.ClassCastException
异常。

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:777) ~[spring-boot-3.1.4.jar:3.1.4]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:758) ~[spring-boot-3.1.4.jar:3.1.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:322) ~[spring-boot-3.1.4.jar:3.1.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[spring-boot-3.1.4.jar:3.1.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[spring-boot-3.1.4.jar:3.1.4]
    at com.example.bootdatajpaproj11callingprocedure.BootDataJpaProj11CallingProcedureApplication.main(BootDataJpaProj11CallingProcedureApplication.java:10) ~[classes/:na]
Caused by: java.lang.ClassCastException: class org.hibernate.metamodel.model.domain.internal.EntityTypeImpl cannot be cast to class org.hibernate.query.OutputableType (org.hibernate.metamodel.model.domain.internal.EntityTypeImpl and org.hibernate.query.OutputableType are in unnamed module of loader 'app')
    at org.hibernate.procedure.internal.ProcedureParameterImpl.toJdbcParameterRegistration(ProcedureParameterImpl.java:118) ~[hibernate-core-6.2.9.Final.jar:6.2.9.Final]
    at org.hibernate.procedure.internal.StandardCallableStatementSupport.interpretCall(StandardCallableStatementSupport.java:90) ~[hibernate-core-6.2.9.Final.jar:6.2.9.Final]
    at org.hibernate.procedure.internal.ProcedureCallImpl.buildOutputs(ProcedureCallImpl.java:619) ~[hibernate-core-6.2.9.Final.jar:6.2.9.Final]
    at org.hibernate.procedure.internal.ProcedureCallImpl.getOutputs(ProcedureCallImpl.java:594) ~[hibernate-core-6.2.9.Final.jar:6.2.9.Final]
    at org.hibernate.procedure.internal.ProcedureCallImpl.outputs(ProcedureCallImpl.java:847) ~[hibernate-core-6.2.9.Final.jar:6.2.9.Final]
    at org.hibernate.procedure.internal.ProcedureCallImpl.getResultList(ProcedureCallImpl.java:973) ~[hibernate-core-6.2.9.Final.jar:6.2.9.Final]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:405) ~[spring-orm-6.0.12.jar:6.0.12]
    at jdk.proxy2/jdk.proxy2.$Proxy92.getResultList(Unknown Source) ~[na:na]
    at com.example.bootdatajpaproj11callingprocedure.runner.CallingPL_ProcedureTestRunner.run(CallingPL_ProcedureTestRunner.java:40) ~[classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:774) ~[spring-boot-3.1.4.jar:3.1.4]
    ... 5 common frames omitted

实体类:

//Actor.java (Entity class)
package com.nt.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Data;
@Entity
@Data
@AllArgsConstructor
public class Actor {
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO)    
    private Integer aid;
    @Column(length = 20)
    private String  aname;
    @Column(length = 20)
    private  String category;
    @Column(unique = true,nullable = true)
    private  Long mobileNo;

    public  Actor() {
        System.out.println("Actor: 0-param constructor"+this.getClass());
    }
}

存储库类:

//IActorRepository.java
package com.nt.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.nt.entity.Actor;

public interface IActorRepository extends JpaRepository<Actor, Integer> {

    
}

运行 StoredProcdure 'P_GET_ACTORS_BY_CATEGORIES' 的 Runner 类:

//CallingPL_ProcedureTestRunner.java
package com.nt.runner;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import com.nt.entity.Actor;

import jakarta.persistence.EntityManager;
import jakarta.persistence.ParameterMode;
import jakarta.persistence.StoredProcedureQuery;


@Component
public class CallingPL_ProcedureTestRunner  implements CommandLineRunner {
 
    @Autowired
    private EntityManager  manager;

    @Override
    public void run(String... args) throws Exception {
        StoredProcedureQuery query=manager.createStoredProcedureQuery("P_GET_ACTORS_BY_CATEGORIES", Actor.class);
        // register both IN ,OUT params  of PL/SQL procedure
        query.registerStoredProcedureParameter(1, String.class,ParameterMode.IN);
        query.registerStoredProcedureParameter(2, String.class,ParameterMode.IN);
        //registering out param
        query.registerStoredProcedureParameter(3, Actor.class,ParameterMode.REF_CURSOR); 
        //set values to IN params
        query.setParameter(1, "CLERK");
        query.setParameter(2, "MANAGER");
        //call PL/SQL procedure
        List<Actor> list=query.getResultList();
        //proecess the result
        list.forEach(System.out::println);
        
    }//main

}//class

Oracle DB“参与者”:

CREATE TABLE "SYSTEM"."ACTOR" 
   (    "AID" NUMBER(10,0) NOT NULL ENABLE, 
    "ANAME" VARCHAR2(20 CHAR), 
    "CATEGORY" VARCHAR2(20 CHAR), 
    "MOBILE_NO" NUMBER(19,0), 
     PRIMARY KEY ("AID"))

Oracle 数据库过程:

create or replace NONEDITIONABLE PROCEDURE P_GET_ACTORS_BY_CATEGORIES 
(
  ROLE1 IN VARCHAR2 
, ROLE2 IN VARCHAR2 
, DETAILS OUT SYS_REFCURSOR 
) AS BEGIN

  open DETAILS for 
  SELECT AID,ANAME,CATEGORY,MOBILE_NO FROM ACTOR WHERE CATEGORY IN(role1, role2) ORDER BY CATEGORY;
  
END P_GET_ACTORS_BY_CATEGORIES;

应用程序属性:

#DataSource Configuration  (Bydefault  hikaricp )
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.username=system
spring.datasource.password=tiger

#JPA- Hibenrate properties
spring.jpa.database-platform=org.hibernate.dialect.OracleDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update

spring-boot版本:3.14

java spring-boot hibernate spring-data-jpa spring-data
1个回答
0
投票

改变: query.registerStoredProcedureParameter(3, Actor.class,ParameterMode.REF_CURSOR);

至: query.registerStoredProcedureParameter(3, Object.class,ParameterMode.REF_CURSOR);

© www.soinside.com 2019 - 2024. All rights reserved.