使用字符串函数

时间:2015-05-07 21:09:56

标签: jpa eclipselink jpa-2.0 jpql

(注意:我已经编辑了我的原帖以简化它)

我无法解决涉及SUBSTR功能的JPQL查询中的语法错误。我正在使用eclipselink 2.3.2。

具体来说,我想提出一个与这种sql查询等效的JPQL:

select * from Table1 t  where SUBSTR(t.someStringField, 91, 5) like 'abc'

我编写了以下JPQL查询(看起来非常像原始的sql副本):

select t from Table1 t where SUBSTR(t.someStringField, 91,5) like 'abc'

(注意:为了清楚起见,我用伪代码形式编写它;查询中有更多的子句,但它们似乎与手头的问题无关,所以我把它剥离到了裸露的最小值)

创建查询时出现以下语法错误:

  

引起:异常[EclipseLink-8025](Eclipse Persistence Services - 2.3.2.v20111125-r10461):org.eclipse.persistence.exceptions.JPQLException   异常描述:语法错误解析查询[],第1行,第172列:意外令牌[(]。   内部异常:NoViableAltException(83 @ [()*环回383:9 :( d = DOT右=属性)*])           at org.eclipse.persistence.exceptions.JPQLException.unexpectedToken(JPQLException.java:372)           at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.handleRecognitionException(JPQLParser.java:320)           在org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.addError(JPQLParser.java:246)           在org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.reportError(JPQLParser.java:363)           在org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.pathExprOrVariableAccess(JPQLParser.java:1436)           在org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.arithmeticPrimary(JPQLParser.java:4720)           在org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.arithmeticFactor(JPQLParser.java:4660)           在org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.arithmeticTerm(JPQLParser.java:4546)           在org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.simpleArithmeticExpression(JPQLParser.java:4462)           在org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.arithmeticExpression(JPQLParser.java:4402)

等...

由于我正在考虑以最简单的形式测试SUBSTR的使用,我开始相信eclipselink支持使用SUBSTR ,尽管它是JPA的一部分2.0根据官方文档。

任何人都可以确认上述假设,否则拒绝它,告诉我这些查询的语法有什么问题,并希望建议一些替代方案? 提前致谢。

1 个答案:

答案 0 :(得分:1)

这完全是我的错误。在查看JPA文档时,我似乎错过了子串函数实际上是SUBSTRING而不是JPA中的SUBSTR这一事实(与SQL相反):-(。所以这解释了为什么无论我多少次将我的查询重写为简化它,我仍会得到同样的错误。感谢阅读!