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...
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, comoCAST
.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.