java - 使用 NEW 时在 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 的构造函数需要一个 Object 和一个 String ,但 Status.id 是一个 long

但是,在执行此查询时,出现以下异常:

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.id 转换为 java.lang.Object 而不会出现异常?

最佳答案

我认为这是不可能的。

顺便说一下,混合 GUI 层(SelectItem 类)和持久层(JPA)是一种不好的做法。我将使用适当的构造函数(长整型、字符串)创建单独的 StatusDTO 类,然后手动将其映射到 SelectItem。

通过这种方式,数据库层的更改将独立于 GUI 的更改。例如,如果数据库中的某些列将更改其类型,它不会影响您的 GUI 层,因为您可以在一个地方处理它 - DTO 类。否则,您将必须遍历 SelectItem 等与数据库查询之间存在依赖关系的所有位置。

关于java - 使用 NEW 时在 JPQL 中进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16482491/

相关文章:

java - 如何让代码等待 GUI 完成?

java - 如何为枚举实现 JSR-303

sql - 如何通过postgresql中的公共(public)列查找两个表之间的特定行?

php - 插入获取数组数据到新数据库

jpa - 如何从 JPA 获取分离对象

java - 基于 JPA 的 JUnit 测试最佳实践

java - 在 Spring Data REST 中配置多对多关系,以便删除一个对象不会删除另一个对象

java - 我们如何修改原始Java类的源代码?

java - Android:当应用程序尝试加密 .txt 文件时出现 NullPointerException

Java:JPQL 选择语句