BDOO error with Persistence EclipseLink-4002

2

I'm trying to increase and I now get this error:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: error de sintaxis en o cerca de «:»
  Position: 44
Error Code: 0
Call: UPDATE Article e SET e.preu = e.preu * (1+ :percentage/100)
Query: DataModifyQuery(sql="UPDATE Article e SET e.preu = e.preu * (1+ :percentage/100)")
javax.persistence.PersistenceException
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeUpdate(QueryImpl.java:308)
    at gestors.GestorArticleExtern.incrementarPreu(GestorArticleExtern.java:81)
    at TestGestors.provaIncrementarPreuDistribuidor1(TestGestors.java:188)
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:340)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.processExceptionForCommError(DatabaseAccessor.java:1611)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:898)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:962)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:631)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:558)
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2002)
    at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:298)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeNoSelectCall(DatasourceCallQueryMechanism.java:271)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeNoSelect(DatasourceCallQueryMechanism.java:251)
    at org.eclipse.persistence.queries.DataModifyQuery.executeDatabaseQuery(DataModifyQuery.java:85)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899)
    at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:798)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1804)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1786)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1751)
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeUpdate(QueryImpl.java:298)
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2310)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2023)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:217)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:421)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:166)
    at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:137)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:890)

the code is as follows:

   public void incrementarPreu(int codiDistribuidor, float percentantge) {
        //TODO completar el metode


  Query ap = em.createNamedQuery("Article.tots");
    List<Article>totsArticles= ap.getResultList();
    List<ArticleExtern> ae = new ArrayList();

    for(Article art : totsArticles){
        if(art instanceof ArticleExtern){

            ArticleExtern e = (ArticleExtern) art;

            if(e.getDistribuidor().getCodi() == codiDistribuidor){

                Query q;
                q= em.createNativeQuery("UPDATE Article e SET e.preu = e.preu * (1+ percentage/100)");
                q.setParameter("percentage", percentantge);
                em.getTransaction().begin();
                q.executeUpdate();
                em.getTransaction().commit();
            }
        }

Can you help me? I do not know what else to do: (

    
asked by Montse Mkd 22.03.2018 в 18:45
source

1 answer

1

Use createQuery instead of createNativeQuery :

Query q = em.createQuery("UPDATE Article e SET e.preu = e.preu * (1 + :percentage/100)");
q.setParameter("percentage", percentantge);

A native query is no longer JPQL but SQL

    
answered by 22.03.2018 / 21:05
source