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 警告]:2011-02-10 17:32:16.846--UnitOfWork(1267140342)--异常 [EclipseLink-4002] (Eclipse Persistence Services - 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 => [user, pw] 查询:DataReadQuery(名称=“登录程序”)
-104 SQL 错误通常表示 SQL 语法错误。
在调用 query.getSingleResult() 之前,所有内容都会被正确处理。调用 query.getResultList() 不会改变任何东西。我已经尝试了几个 1.x 和 2.x EclipseLink 版本。Firebird DB 版本是 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;
}
更新:在稍微修改之后,我相信 EclipseLink 实现中可能存在错误,因为EXECUTE PROCEDURE LOGIN_PROCEDURE(USER_NAME = ?, USER_PASSWORD = ?)不是用于调用过程的有效 Firebird 2.1 语法。