执行了CallableStatement函数,并且out参数1的类型为java.sql.Types = 2001,但是注册了类型java.sql.Types = 1111

时间:2018-07-24 05:24:44

标签: postgresql hibernate jpa eclipselink

我试图通过JPA2.1在postgresql中调用存储过程(具有out refcursor参数),如下所示:

public class DimDateAvailableController : ODataController
{
  private readonly TelemetryDbContext data;

  public DimDateAvailableController(TelemetryDbContext data)
  {
    this.data = data;
  }

  [EnableQuery(AllowedQueryOptions = AllowedQueryOptions.Supported, PageSize = 2000)]
  public IActionResult Get()
  {
    return Ok(this.data.DimDateAvailable.AsQueryable());
  }
}

我收到以下错误:

public class JpaINParam {

    public static void main(String[] args) throws Exception {

        EntityManagerFactory emfactory = Persistence
                .createEntityManagerFactory("JPA2");
        EntityManager entitymanager = emfactory.createEntityManager();
        entitymanager.getTransaction().begin();


        StoredProcedureQuery q = entitymanager.createNamedStoredProcedureQuery("get_hibernate_dtl");

        q.setParameter("modeval", "1");
        q.execute();

        @SuppressWarnings("unchecked")
        List<Student> students = (List<Student>) q.getOutputParameterValue("resultset");

        for (Student student : students) {
            System.out.println(student.getFname());    
        }           

        entitymanager.getTransaction().commit();
        entitymanager.close();

        try {
            // storedProcedure.executeUpdate(); 
            System.out.println("444444444444");
        } catch (Exception e) {
            e.printStackTrace();
        }               
    }    
}
     

2.5.2.v20140319-9ad6abd):org.eclipse.persistence.exceptions.DatabaseException       内部异常:org.postgresql.util.PSQLException:执行了CallableStatement函数,并且out参数1为   类型java.sql.Types = 2001,但是类型java.sql.Types = 1111是   注册。       错误代码:0       致电:{?=致电get_hibernate_dtl(?)}         绑定=> [绑定2个参数]       查询:ResultSetMappingQuery(name =“ get_hibernate_dtl”)         在org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedException(QueryImpl.java:378)         在org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:260)         在org.eclipse.persistence.internal.jpa.StoredProcedureQueryImpl.execute(StoredProcedureQueryImpl.java:316)         在com.javacodegeeks.examples.jpa.service.JpaINParam.main(JpaINParam.java:36)

以下是我的实体类:

Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services -

这是我在Postgresql中的过程:

@NamedStoredProcedureQuery(name="get_hibernate_dtl", procedureName="get_hibernate_dtl", resultClasses={Student.class}, returnsResultSet = true, parameters={
        @StoredProcedureParameter(queryParameter="resultset", name="resultset", mode=ParameterMode.REF_CURSOR,type=Class.class),
        @StoredProcedureParameter(queryParameter="modeval", name="modeval", mode=ParameterMode.IN,type=String.class)


        })

@Entity
public class Student {
     @Id
     @GeneratedValue(strategy= GenerationType.AUTO)
     private int sid;
     private String fname;
     private String lname;
     private String dept;
     private int year;
     private String email;

    public Student() {
        // TODO Auto-generated constructor stub
    }

    public Student(int sid, String fname, String lname, String dept, int year,
            String email) {
        super();
        this.sid = sid;
        this.fname = fname;
        this.lname = lname;
        this.dept = dept;
        this.year = year;
        this.email = email;
    }



    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public String getFname() {
        return fname;
    }

    public void setFname(String fname) {
        this.fname = fname;
    }

    public String getLname() {
        return lname;
    }

    public void setLname(String lname) {
        this.lname = lname;
    }

    public String getDept() {
        return dept;
    }

    public void setDept(String dept) {
        this.dept = dept;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }   

    @Override
    public String toString() {
        return "Student [sid=" + sid + ", fname=" + fname + ", lname=" + lname
                + ", dept=" + dept + ", year=" + year + ", email=" + email
                + "]";
    }       
}

0 个答案:

没有答案