Spring Boot java-ClassCastException:无法将org.hibernate.metamodel.model.domain.internal. ObjectTypeImpl类强制转换为org.hibernate.query.OutputableType类

u4dcyp6a  于 2024-01-06  发布在  Spring
关注(0)|答案(1)|浏览(251)

我在Spring Data JPA应用程序中尝试使用Jakarta RealtyManager运行StoredProcedure时遇到java.lang.ClassCastException异常。

  1. java.lang.IllegalStateException: Failed to execute CommandLineRunner
  2. at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:777) ~[spring-boot-3.1.4.jar:3.1.4]
  3. at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:758) ~[spring-boot-3.1.4.jar:3.1.4]
  4. at org.springframework.boot.SpringApplication.run(SpringApplication.java:322) ~[spring-boot-3.1.4.jar:3.1.4]
  5. at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[spring-boot-3.1.4.jar:3.1.4]
  6. at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[spring-boot-3.1.4.jar:3.1.4]
  7. at com.example.bootdatajpaproj11callingprocedure.BootDataJpaProj11CallingProcedureApplication.main(BootDataJpaProj11CallingProcedureApplication.java:10) ~[classes/:na]
  8. 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')
  9. at org.hibernate.procedure.internal.ProcedureParameterImpl.toJdbcParameterRegistration(ProcedureParameterImpl.java:118) ~[hibernate-core-6.2.9.Final.jar:6.2.9.Final]
  10. at org.hibernate.procedure.internal.StandardCallableStatementSupport.interpretCall(StandardCallableStatementSupport.java:90) ~[hibernate-core-6.2.9.Final.jar:6.2.9.Final]
  11. at org.hibernate.procedure.internal.ProcedureCallImpl.buildOutputs(ProcedureCallImpl.java:619) ~[hibernate-core-6.2.9.Final.jar:6.2.9.Final]
  12. at org.hibernate.procedure.internal.ProcedureCallImpl.getOutputs(ProcedureCallImpl.java:594) ~[hibernate-core-6.2.9.Final.jar:6.2.9.Final]
  13. at org.hibernate.procedure.internal.ProcedureCallImpl.outputs(ProcedureCallImpl.java:847) ~[hibernate-core-6.2.9.Final.jar:6.2.9.Final]
  14. at org.hibernate.procedure.internal.ProcedureCallImpl.getResultList(ProcedureCallImpl.java:973) ~[hibernate-core-6.2.9.Final.jar:6.2.9.Final]
  15. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
  16. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
  17. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
  18. at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
  19. at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:405) ~[spring-orm-6.0.12.jar:6.0.12]
  20. at jdk.proxy2/jdk.proxy2.$Proxy92.getResultList(Unknown Source) ~[na:na]
  21. at com.example.bootdatajpaproj11callingprocedure.runner.CallingPL_ProcedureTestRunner.run(CallingPL_ProcedureTestRunner.java:40) ~[classes/:na]
  22. at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:774) ~[spring-boot-3.1.4.jar:3.1.4]
  23. ... 5 common frames omitted

字符串
实体类:

  1. //Actor.java (Entity class)
  2. package com.nt.entity;
  3. import jakarta.persistence.Column;
  4. import jakarta.persistence.Entity;
  5. import jakarta.persistence.GeneratedValue;
  6. import jakarta.persistence.GenerationType;
  7. import jakarta.persistence.Id;
  8. import lombok.AllArgsConstructor;
  9. import lombok.Data;
  10. @Entity
  11. @Data
  12. @AllArgsConstructor
  13. public class Actor {
  14. @Id
  15. @GeneratedValue(strategy = GenerationType.AUTO)
  16. private Integer aid;
  17. @Column(length = 20)
  18. private String aname;
  19. @Column(length = 20)
  20. private String category;
  21. @Column(unique = true,nullable = true)
  22. private Long mobileNo;
  23. public Actor() {
  24. System.out.println("Actor: 0-param constructor"+this.getClass());
  25. }
  26. }


Repositor类:

  1. //IActorRepository.java
  2. package com.nt.repository;
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import com.nt.entity.Actor;
  5. public interface IActorRepository extends JpaRepository<Actor, Integer> {
  6. }


运行StoredProcdure“P_GET_ACTORS_BY_CATEGORIES”的运行程序类:

  1. //CallingPL_ProcedureTestRunner.java
  2. package com.nt.runner;
  3. import java.util.List;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.CommandLineRunner;
  6. import org.springframework.stereotype.Component;
  7. import com.nt.entity.Actor;
  8. import jakarta.persistence.EntityManager;
  9. import jakarta.persistence.ParameterMode;
  10. import jakarta.persistence.StoredProcedureQuery;
  11. @Component
  12. public class CallingPL_ProcedureTestRunner implements CommandLineRunner {
  13. @Autowired
  14. private EntityManager manager;
  15. @Override
  16. public void run(String... args) throws Exception {
  17. StoredProcedureQuery query=manager.createStoredProcedureQuery("P_GET_ACTORS_BY_CATEGORIES", Actor.class);
  18. // register both IN ,OUT params of PL/SQL procedure
  19. query.registerStoredProcedureParameter(1, String.class,ParameterMode.IN);
  20. query.registerStoredProcedureParameter(2, String.class,ParameterMode.IN);
  21. //registering out param
  22. query.registerStoredProcedureParameter(3, Actor.class,ParameterMode.REF_CURSOR);
  23. //set values to IN params
  24. query.setParameter(1, "CLERK");
  25. query.setParameter(2, "MANAGER");
  26. //call PL/SQL procedure
  27. List<Actor> list=query.getResultList();
  28. //proecess the result
  29. list.forEach(System.out::println);
  30. }//main
  31. }//class


Oracle数据库“执行者”:

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


Oracle DB过程:

  1. create or replace NONEDITIONABLE PROCEDURE P_GET_ACTORS_BY_CATEGORIES
  2. (
  3. ROLE1 IN VARCHAR2
  4. , ROLE2 IN VARCHAR2
  5. , DETAILS OUT SYS_REFCURSOR
  6. ) AS BEGIN
  7. open DETAILS for
  8. SELECT AID,ANAME,CATEGORY,MOBILE_NO FROM ACTOR WHERE CATEGORY IN(role1, role2) ORDER BY CATEGORY;
  9. END P_GET_ACTORS_BY_CATEGORIES;


application.properties:

  1. #DataSource Configuration (Bydefault hikaricp )
  2. spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
  3. spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
  4. spring.datasource.username=system
  5. spring.datasource.password=tiger
  6. #JPA- Hibenrate properties
  7. spring.jpa.database-platform=org.hibernate.dialect.OracleDialect
  8. spring.jpa.show-sql=true
  9. spring.jpa.hibernate.ddl-auto=update


spring-boot版本:3.14

8xiog9wr

8xiog9wr1#

变更:

  1. query.registerStoredProcedureParameter(3, Actor.class,ParameterMode.REF_CURSOR);

字符串
收件人:

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

相关问题