2011-02-10 68 views
2
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(); 

執行存儲在程序火鳥...執行此代碼我得到使用JPA NamedStoredProcedureQuery

[EL警告]: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 =?)結合=> [用戶, PW ]查詢: DataReadQuery(名稱= 「LOGIN_PROCEDURE」)

的-104 SQL錯誤通常表示一個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語法。

回答

0

通過this post的啓發,我已經找到了解決辦法/解決方法:

public class JPATest { 
final Session session; 

JPATest() { 
    final String DATABASE_USERNAME = "SYSDBA"; 
    final String DATABASE_PASSWORD = "masterkey"; 
    final String DATABASE_URL = "jdbc:firebirdsql:dbServer/3050:e:/my/db.fdb"; 
    final String DATABASE_DRIVER = "org.firebirdsql.jdbc.FBDriver"; 

    final DatabaseLogin login = new DatabaseLogin(); 
    login.setUserName(DATABASE_USERNAME); 
    login.setPassword(DATABASE_PASSWORD); 
    login.setConnectionString(DATABASE_URL); 
    login.setDriverClassName(DATABASE_DRIVER); 
    login.setDatasourcePlatform(new FirebirdPlatform()); 
    login.bindAllParameters(); 

    final Project project = new Project(login); 
    session = project.createDatabaseSession(); 
    session.setLogLevel(SessionLog.FINE); 
    ((DatabaseSession) session).login(); 

} 

public static void main(String[] args) { 
    final JPATest jpaTest = new JPATest(); 
    jpaTest.run(); 
} 

protected void run() { 
    testProcCursor(); 
} 

/* 
* Run Proc with scalar input and cursor output 
*/ 
@SuppressWarnings("unchecked") 
private void testProcCursor() { 
    final StoredProcedureCall call = new StoredProcedureCall(); 
    call.setProcedureName("LOGIN"); 
    call.addUnamedArgument("USER_NAME"); // .addNamedArgument doesn't work 
    call.addUnamedArgument("USER_PASSWORD"); 

    final DataReadQuery query = new DataReadQuery(); 
    query.setCall(call); 
    query.addArgument("USER_NAME"); 
    query.addArgument("USER_PASSWORD"); 

    final List<String> queryArgs = new ArrayList<String>(); 
    queryArgs.add("onlinetester"); 
    queryArgs.add("test"); 

    final List outList = (List) session.executeQuery(query, queryArgs); 
    final ListIterator<DatabaseRecord> listIterator = ((List<DatabaseRecord>) outList).listIterator(); 
    while (listIterator.hasNext()) { 
     final DatabaseRecord databaseRecord = listIterator.next(); 
     System.out.println("Value -->" + databaseRecord.getValues()); 
    } 
} 

}

顯然命名參數沒有在我的具體配置支持,但在使用註釋未命名參數,也沒有要麼解決了這個問題。但是,如上所述,使用未命名的參數爲我解決了這個問題。

1

通過指定名稱=「USER_NAME」,您正在使Eclipselink使用「USER_NAME =?」語法而不是傳入未命名的參數。嘗試刪除名稱定義。

+0

得到:「調用:EXECUTE PROCEDURE LOGIN1(param1 =?)」,但錯誤保持不變。實際上包含的括號不是有效的FB SQL語法。有效的FB SQL語法看起來應該像「EXECUTE PROCEDURE LOGIN1?」 – Alex 2011-02-16 05:55:26