2013-05-10 32 views
0

當我使用的EclipseLink,我有以下JPQL查詢在JPQL鑄造:採用新型

SELECT NEW javax.faces.model.SelectItem((java.lang.Object) s.id, s.description) FROM Status s WHERE s.active = TRUE 

需要s.id前投,因爲SelectItem的構造函數需要一個ObjectString,但Status.idlong

然而,執行這個查詢,我得到以下異常時:

Caused by: Exception [EclipseLink-8024] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing the query [SELECT NEW javax.faces.model.SelectItem((java.lang.Object) s.id, s.description) FROM Status WHERE s.active = TRUE], line 1, column 59: syntax error at [s]. 
Internal Exception: MismatchedTokenException(78!=82) 
    at org.eclipse.persistence.exceptions.JPQLException.syntaxErrorAt(JPQLException.java:362) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.handleRecognitionException(JPQLParser.java:304) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.addError(JPQLParser.java:245) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.reportError(JPQLParser.java:362) 
    at org.eclipse.persistence.internal.libraries.antlr.runtime.BaseRecognizer.recoverFromMismatchedElement(Unknown Source) 
    at org.eclipse.persistence.internal.libraries.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken(Unknown Source) 
    at org.eclipse.persistence.internal.libraries.antlr.runtime.BaseRecognizer.mismatch(Unknown Source) 
    at org.eclipse.persistence.internal.libraries.antlr.runtime.BaseRecognizer.match(Unknown Source) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.constructorExpression(JPQLParser.java:2635) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectExpression(JPQLParser.java:2045) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectItem(JPQLParser.java:1351) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectClause(JPQLParser.java:1266) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectStatement(JPQLParser.java:352) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.document(JPQLParser.java:276) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.parse(JPQLParser.java:133) 
    at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.buildParseTree(JPQLParser.java:94) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:198) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:173) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:125) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:109) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1326) 
    ... 51 more 
Caused by: MismatchedTokenException(78!=82) 
    ... 66 more 

我怎麼能投s.idjava.lang.Object沒有得到一個例外?

回答

1

我不認爲這是可能的。

順便說一句,混合GUI層(SelectItem類)和持久層(JPA)是一種不好的做法。我將用適當的構造函數(long,String)創建單獨的StatusDTO類,然後手動將其映射到SelectItem。

通過這種方式,您將在GUI更改上獨立進行數據庫層更改。例如,如果數據庫中的某個列會更改其類型,那麼它不會影響您的GUI層,因爲您可以在一個地方--DTO類中處理它。否則,你將不得不經過SelectItem等與數據庫查詢之間的所有依賴關係。