我遇到此问题, REPLACE 功能无法使用eclipselink版本2.5.2。
这是我的代码:
String sSql = " SELECT e FROM br.com.megasoft.protocolo.entity.Assunto e WHERE ( REPLACE(REPLACE(REPLACE( UPPER(e.titulo), '/', ''), '-', ''), '.', '') LIKE UPPER('A') )";
TypedQuery<?> query = getEntityManager().createQuery(sSql, Class.forName(this.tabela));
第二个参数的值为:class br.com.megasoft.protocolo.entity.Assunto
它给出了这个例外:
Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing [ FROM br.com.megasoft.protocolo.entity.Assunto e WHERE ( REPLACE(REPLACE(REPLACE( UPPER(e.titulo), '/', ''), '-', ''), '.', '') LIKE UPPER( :valorPesq10) ) ].
[54, 150] The expression is not a valid conditional expression.
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildException(HermesParser.java:155)
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.validate(HermesParser.java:334)
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:278)
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildQuery(HermesParser.java:163)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:142)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:116)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:102)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:86)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1603)
... 50 more
当我使用Hibernate时它完全正常。
当我运行简单的SQL时,没有 REPLACE ,它可以正常工作。
Obs:Eclipselink 2.5.2正在使用JPA 2.1。我正在使用Tomcat8,Eclipse Kepler。
答案 0 :(得分:6)
我找到了解决方案,谢谢各位有用的信息。
sql需要这样:
SELECT e FROM br.com.megasoft.protocolo.entity.Assunto e WHERE FUNCTION('REPLACE', e.titulo, '/', '') LIKE UPPER('A')
这样,我将使用 JPA 2.1规范中定义的 FUNCTION 。
答案 1 :(得分:3)
我在SPEC和这个oracle页面(http://docs.oracle.com/cd/E17904_01/apirefs.1111/e13946/ejb3_langref.html#ejb3_langref_string_fun)中搜索过,并且没有用于JPQL函数的REPLACE。
我相信这是一个Hibernate函数:http://lkumarjain.blogspot.com.br/2013/07/compare-string-by-removing-white-chars.html
换句话说,REPLACE属于HQL而不属于JPQL。
答案 2 :(得分:2)
JPA 2.1有JPQL&#34; FUNCTION&#34;它允许在JPQL语句中使用SQL函数。 您使用的不是JPQL,只是对规范的简单审查或您的JPA实施文档会告诉您