es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error de spring jpa @Query, se esperaba CERRAR, se encontró ‘(‘

Tengo la siguiente consulta de MySQL que funciona bien:

*Edit: la ruta es solo con fines ilustrativos… No quería copiar mis paquetes…

select COUNT(IF(amount > 0, amount, 0)) as creditCount,
       COUNT(IF(amount < 0, amount, 0)) as debitCount,
       SUM(IF(amount > 0, amount, 0)) as credit,
       SUM(IF(amount < 0, amount, 0)) as debit,
       SUM(amount)                    as balance,
       cp.surname, cp.id, pcp.number from prepaid_card_transaction_pojo pctp
         join prepaid_card_pojo pcp on pctp.account = pcp.id
         join customer_pojo cp on pcp.id = cp.prepaid_card
where pcp.number = '1000765352' AND pctp.client = UUID_TO_BIN('fb9dbcac-cd03-46ad-94b0-2709b0b0e2a8') AND booking_time > '2020-12-01 00:00:00' group by cp.id;

Deseo transferirlo a JPQL:

@Query("select new path...Bean(" + //
            "COUNT(IF(pctp.amount > 0, pctp.amount, 0))," + //
            "COUNT(IF(pctp.amount < 0, pctp.amount, 0)), " + //
            "SUM(IF(pctp.amount > 0, pctp.amount, 0)), " + //
            "SUM(IF(pctp.amount < 0, pctp.amount, 0)), " + //
            "SUM(pctp.amount), cp) " + //
            "FROM PrepaidCardTransactionPojo pctp " + //
            "JOIN PrepaidCardPojo pcp ON pctp.account = pcp.id " + //
            "JOIN CustomerPojo cp ON pcp.id = cp.prepaid_card " + //
            "WHERE pcp.number =:voucherNumber AND pctp.client =:client AND booking_time >= :from AND booking_time < :to GROUP BY :customer")
List<bean> loadGroupedCustomerPrepaidTransactions(@Param("client") ClientReadable client, @Param("customer") CustomerReadable customer, @Param("voucherNumber") String voucherNumber, @Param("from") Date from, @Param("to") Date to);

Recibo el siguiente error:

...QuerySyntaxException: expecting CLOSE, found '(' near...

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que puede haber un problema con el uso de paréntesis en la consulta JPQL. Esto podría deberse a que JPQL tiene una sintaxis diferente a SQL y, por lo tanto, requiere un uso diferente de corchetes.

    Una posible solución podría ser usar corchetes cuadrados en lugar de paréntesis en las declaraciones IF, como se muestra a continuación:

    @Query("select new path...Bean(" +
    "COUNT(CASE WHEN pctp.amount > 0 THEN pctp.amount ELSE 0 END)," +
    "COUNT(CASE WHEN pctp.amount < 0 THEN pctp.amount ELSE 0 END)," +
    "SUM(CASE WHEN pctp.amount > 0 THEN pctp.amount ELSE 0 END)," +
    "SUM(CASE WHEN pctp.amount < 0 THEN pctp.amount ELSE 0 END)," +
    "SUM(pctp.amount), cp) " +
    "FROM PrepaidCardTransactionPojo pctp " +
    "JOIN PrepaidCardPojo pcp ON pctp.account = pcp.id " +
    "JOIN CustomerPojo cp ON pcp.id = cp.prepaid_card " +
    "WHERE pcp.number =:voucherNumber AND pctp.client =:client AND booking_time >= :from " +
    "AND booking_time < :to GROUP BY :customer")
    List<bean> loadGroupedCustomerPrepaidTransactions(@Param("client") ClientReadable client,
    @Param("customer") CustomerReadable customer, @Param("voucherNumber") String voucherNumber,
    @Param("from") Date from, @Param("to") Date to);

    Esto debería solucionar cualquier error de sintaxis relacionado con el uso de paréntesis. Además, cabe destacar que la función SQL UUID_TO_BIN no funcionará en JPQL, por lo que deberá ser reemplazada por una función compatible con JPQL, como CAST.

    Finalmente, asegúrese de que la ruta utilizada en el constructor new path...Bean coincida con el paquete y el nombre de clase de su clase.

Comments are closed.