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();
... выполняя этот код я получаю
[EL Warning]: 2011-02-10 17: 32: 16.846 - UnitOfWork (1267140342) - Исключение
[EclipseLink-4002] (Eclipse
Постоянные Услуги -
1.2.0.v20091016-r5565): org.eclipse.persistence.exceptions.DatabaseException
Внутренняя ошибка:
org.firebirdsql.jdbc.FBSQLException:
GDS Исключение. 335544569. Динамический SQL
Ошибка SQL код ошибки = -104 токен
неизвестно - строка 1, столбец 36
= Код ошибки: 335544569 Вызов: EXECUTE PROCEDURE LOGIN_PROCEDURE (USER_NAME =
?, USER_PASSWORD =?) Bind => [пользователь,
pw] Запрос:
DataReadQuery (name = "login_procedure")
Ошибка SQL -104 обычно указывает на ошибку синтаксиса SQL.
Все обрабатывается без ошибок, пока не будет вызван query.getSingleResult (). Вызов query.getResultList () ничего не меняет. Я пробовал несколько версий 1.x и 2.x EclipseLink. Версия БД Firebird - 2.1.
Декларация 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;
}
UPDATE:
Поработав еще немного, я полагаю, что в реализации EclipseLink может возникнуть ошибка: EXECUTE PROCEDURE LOGIN_PROCEDURE (USER_NAME =?, USER_PASSWORD =?) недопустим синтаксис Firebird 2.1 для вызова процедур.