我试图通过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
+ "]";
}
}