Esecuzione di procedure memorizzate in Firebird utilizzando JPA denominata ProcedureQuery
-
12-11-2019 - |
Domanda
EntityManager em = getEntityManager();
EntityTransaction etx = em.getTransaction();
etx.begin();
Query query = em.createNamedQuery("login_procedure").setParameter("param1","user").setParameter("param2", "pw");
Integer result = 23;
try {
System.out.println("query = " + query.getSingleResult());
} catch (Exception e) {
result = null;
e.printStackTrace();
}
etx.commit();
em.close();
... eseguire questo codice che ottengo
EL AVVERTENZA]: 2011-02-10 17: 32: 16.846-Unitofwork (1267140342)-Eccezione [Eclipselink-4002] (Eclipse Persistence Services-1.2.0.V20091016-R5565): org.eclipse.Persistence.exceptions .Databasexception Eccezione interna: org.firebirdsql.jdbc.fbsqlexception: eccezione GDS. 335544569. Errore SQL dinamico Codice di errore SQL = -104 Sconosciuto token - riga 1, colonna 36 = Codice di errore: 335544569 Chiama: eseguire procedura login_procedure (user_name =?, User_password =?) Bind => [utente, pw] query: DataReadQuery ( name = "login_procedure")
L'errore SQL -104 di solito indica un errore di sintassi SQL.
Tutto viene elaborato senza alcun errore fino a quando non viene chiamato query.getSingleResult (). Chiamare query.getResultList () non cambia nulla. Ho provato diverse versioni Eclipselink 1.x e 2.x. La versione Firebird DB è 2.1.
La dichiarazione JPA2 è:
@Entity
@NamedStoredProcedureQuery(
name = "login_procedure",
resultClass = void.class,
procedureName = "LOGIN_PROCEDURE",
returnsResultSet = false,
parameters = {
@StoredProcedureParameter(queryParameter = "param1", name = "USER_NAME", direction = Direction.IN, type = String.class),
@StoredProcedureParameter(queryParameter = "param2", name = "USER_PASSWORD", direction = Direction.IN, type = String.class)
}
)
@Table(name = "USERS")
public class Login implements Serializable {
@Id
private Long id;
}
AGGIORNAMENTO: dopo aver armeggiato un po 'di più, credo che potrebbe esserci un errore nell'implementazione Eclipselink come Esegui procedura login_procedure (user_name =?, User_password =?) non è valida la sintassi Firebird 2.1 per le procedure di chiamata.
Nessuna soluzione corretta