Java 使用NEW时在JPQL中强制转换
我正在使用Eclipselink,我有以下JPQL查询:Java 使用NEW时在JPQL中强制转换,java,select,jpa,eclipselink,jpql,Java,Select,Jpa,Eclipselink,Jpql,我正在使用Eclipselink,我有以下JPQL查询: SELECT NEW javax.faces.model.SelectItem((java.lang.Object) s.id, s.description) FROM Status s WHERE s.active = TRUE 需要在s.id之前强制转换,因为SelectItem的构造函数需要对象和字符串,但是Status.id是长的 但是,在执行此查询时,我得到以下异常: Caused by: Exception [Eclipse
SELECT NEW javax.faces.model.SelectItem((java.lang.Object) s.id, s.description) FROM Status s WHERE s.active = TRUE
需要在s.id
之前强制转换,因为SelectItem
的构造函数需要对象和字符串,但是Status.id
是长的
但是,在执行此查询时,我得到以下异常:
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
原因:异常[EclipseLink-8024](Eclipse持久性服务-2.0.1.v20100213-r6600):org.Eclipse.Persistence.exceptions.JPQLException
异常描述:语法错误解析查询[SELECT NEW javax.faces.model.SelectItem((java.lang.Object)s.id,s.Description)FROM Status WHERE s.active=TRUE],第1行第59列:语法错误位于[s]。
内部异常:不匹配的TokenException(78!=82)
位于org.eclipse.persistence.exceptions.jpqleexception.syntaxErrorAt(jpqleexception.java:362)
位于org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.handleRecognitionException(JPQLParser.java:304)
位于org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.addError(JPQLParser.java:245)
位于org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.reportError(JPQLParser.java:362)
位于org.eclipse.persistence.internal.libraries.antlr.runtime.BaseRecognizer.recoverfromMismatchDelement(未知源)
位于org.eclipse.persistence.internal.libraries.antlr.runtime.BaseRecognizer.recoverfrommisschedtoken(未知源)
位于org.eclipse.persistence.internal.libraries.antlr.runtime.BaseRecognizer.mismatch(未知源)
位于org.eclipse.persistence.internal.libraries.antlr.runtime.BaseRecognizer.match(未知源)
位于org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.constructorExpression(JPQLParser.java:2635)
位于org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectExpression(JPQLParser.java:2045)
位于org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectItem(JPQLParser.java:1351)
位于org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectClause(JPQLParser.java:1266)
位于org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectStatement(JPQLParser.java:352)
位于org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.document(JPQLParser.java:276)
位于org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.parse(JPQLParser.java:133)
位于org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.buildParseTree(JPQLParser.java:94)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(ejbqueryyimpl.java:198)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:173)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl(EJBQueryImpl.java:125)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl(EJBQueryImpl.java:109)
位于org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1326)
... 还有51个
原因:不匹配的TokenException(78!=82)
... 66多
如何将s.id
转换为java.lang.Object
,而不出现异常?我认为这是不可能的
顺便说一下,将GUI层(SelectItem类)和持久性层(JPA)混为一谈是一种不好的做法。我将使用适当的构造函数(长,字符串)创建单独的StatusDTO类,然后手动将其映射到SelectItem
通过这种方式,您将拥有独立于GUI更改的DB层更改。例如,若数据库中的某个列将更改其类型,它将不会影响GUI层,因为您可以在一个地方处理它—DTO类。否则,您必须遍历SelectItem等与DB查询之间存在依赖关系的所有地方