2012-11-06 11 views
6

Chúng tôi đang gặp sự cố khi gọi thủ tục được lưu trữ từ ứng dụng. Cơ sở dữ liệu là oracle 10g proc này có 2 tham số đầu vào và 2 tham số đầu ra.cách gọi thủ tục lưu trữ với nhiều tham số vào và ra bằng cách sử dụng trình quản lý thực thể

Input 1: - DB-Danh sách Input 2: - Chuỗi

Output 1: -Again một DB-Danh sách Output 2: - Số

Khi chúng tôi đang cố gắng sử dụng

Query q = session.createSQLQuery("{call proc_name(?,?,?,?)}"); 

Chúng tôi không thể phân biệt giữa thông số in và thông số out. Vậy làm thế nào chúng ta nên xử lý nó bằng cách sử dụng này.

Ngoài ra, Chúng tôi đã cố gắng để sử dụng báo cáo có thể được gọi như sau:

Session session = (Session) getEntityManager().getDelegate(); 
SessionImpl sessionImpl = ((SessionImpl) getEntityManager().getDelegate()); 
Connection cc = sessionImpl.connection(); 
CallableStatement callableStatement = null; 

callableStatement = cc.prepareCall("{call proc_name(?,?,?,?)}"); 
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("DB_LIST",callableStatement.getConnection()); 
ARRAY paramArray = new ARRAY(descriptor, callableStatement.getConnection(), array); 
callableStatement.setArray(1, paramArray); 
callableStatement.setString(2, "N"); 
callableStatement.registerOutParameter(3, OracleTypes.ARRAY, "DB_RETURN_LIST"); 
callableStatement.registerOutParameter(4, Types.INTEGER); 
// executing the query 
callableStatement.execute(); 

Chúng tôi nhận được lỗi sau:

javax.ejb.EJBException: java.lang.ClassCastException: 
$Proxy50 cannot be cast to oracle.jdbc.OracleConnection 

Bạn có thể vui lòng cung cấp một số gợi ý.

Đây là Manager Entity mà chúng ta đang sử dụng

public abstract class GenericDAO<T, ID extends Serializable> implements IGenericDAO<T, ID> { 
private final Class<T> persistentClass; 
@PersistenceContext(unitName = "firstPersistenceUnit") 
@Produces 
private EntityManager entityManager; 

public void setEntityManager(final EntityManager entityManager) throws DataAccessException { 
this.entityManager = entityManager; 
} 

public EntityManager getEntityManager() throws DataAccessException { 
return entityManager; 
} 
} 

Đây là mục trong Persistance.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
<persistence-unit name="firstPersistenceUnit"> 
<provider>org.hibernate.ejb.HibernatePersistence</provider> 
<jta-data-source>java:jboss/firstDataSource</jta-data-source> 
<class>com.domain.Branch</class> 
<exclude-unlisted-classes>true</exclude-unlisted-classes> 
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> 
<validation-mode>AUTO</validation-mode> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
     <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver" /> 
     <property name="hibernate.show_sql" value="true"/> 
     <property name="hibernate.format_sql" value="true"/> 
    </properties> 
</persistence-unit> 

<persistence-unit name="secondPersistenceUnit"> 
<provider>org.hibernate.ejb.HibernatePersistence</provider> 
<jta-data-source>java:jboss/secondDataSource</jta-data-source> 
<class>com.domain.PocJeeCounty</class> 
<exclude-unlisted-classes>true</exclude-unlisted-classes> 
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> 
<validation-mode>AUTO</validation-mode> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
     <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver" /> 
     <property name="hibernate.show_sql" value="true"/> 
     <property name="hibernate.format_sql" value="true"/> 
    </properties> 
</persistence-unit> 
</persistence> 
+0

Tôi nghĩ vấn đề không phải là với các thủ tục lưu trữ, là với Entity Manager.Can bạn u dán mã hoàn chỉnh của bạn. –

+0

Hi @SajanChandran tôi đã thêm mã cho trình quản lý thực thể cũng như persistance.xml mà chúng tôi đang sử dụng –

+0

Chúng tôi đã thử sử dụng tính năng này cũng như session.doWork. Nhưng nó vẫn cho chúng ta lỗi: - java.lang.Exception: javax.ejb.EJBException: java.lang.ClassCastException: $ Proxy66 không thể được đưa vào oracle.jdbc.OracleConnection. [/ Code] Điều này xảy ra đặc biệt khi chúng ta cố gắng để có được kết nối cho Array Descriptor. ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor (DB_LIST ", callableStatement.getConnection()); –

Trả lời

2

Dont sử dụng cách thứ hai, thay vì tạo ra và xác định truy vấn và truy vấn các thông số sử dụng @NamedStoredProcedureQuery và @StoredProcedureParameter. Sau đây là mã cho yêu cầu của bạn

@NamedStoredProcedureQuery( 
    name="PROC_NAME", 
    procedureName="proc_name", 
    returnsResultSet=true/false, 
    parameters={ 
     @StoredProcedureParameter(queryParameter="param1",name="p1",direction=Direction.IN,type=Integer.class), 
     @StoredProcedureParameter(queryParameter="param2",name="p2",direction=Direction.IN,type=Timestamp.class), 
     @StoredProcedureParameter(queryParameter="param3",name="p3",direction=Direction.OUT,type=String.class), 
     @StoredProcedureParameter(queryParameter="param4",name="p4",direction=Direction.OUT,type=Integer.class) 
    } 
    ) 

và sử dụng em.createNativeQuery() phương pháp

Các vấn đề liên quan