spring-bootspring-data-jpahibernate-6.x

Spring data jpa 3.1.4 - Hibernate 6.1.6.Final - Validation failed for query for method public abstract java.util.List


After migration to spring boot 3.1.4, I get this errors in repositories. (I have same error with spring boot 3.2 and hibernate 6.4)

Could not create query for public abstract java.util.List com.xx.xx.xx.repository.IndemniteRepository.findAllForExport(com.xx.xx.xx.domain.penalite.AvisPenaliteStatutEnum,java.math.BigDecimal,java.util.List); 


Reason: Validation failed for query for method public abstract java.util.List com.xx.xx.xx.repository.IndemniteRepository.findAllForExport(com.xx.xx.xx.domain.penalite.AvisPenaliteStatutEnum,java.math.BigDecimal,java.util.List)

Code snippets:

@Repository
public interface IndemniteRepository extends JpaRepository<Indemnite, Long>, JpaSpecificationExecutor<Indemnite> {

@Query("SELECT ind FROM Indemnite ind " +
        "WHERE ind.indemniteAFacturer > :indemniteAFacturer " +
        "AND ind.avis.statut = :statut " +
        "AND (:statut != com.xx.xx.xx.domain.penalite.AvisPenaliteStatutEnum.POUR_FACTURE AND ind.avis.facturationEnAttente IS TRUE OR ind.avis.facturationEnAttente IS FALSE) " +
        "AND ind.avis.typePenalite.name IN :typePenalite " +
        "ORDER BY ind.avis.date ASC")
    List<Indemnite> findAllForExport(@Param("statut") AvisPenaliteStatutEnum statut,
                                     @Param("indemniteAFacturer") BigDecimal indemniteAFacturer,
                                     @Param("typePenalite") List<TypePenaliteEnum> typePenalite);
}
Caused by: org.hibernate.query.sqm.ParsingException line 1:241 no viable alternative at input 'SELECTindFROMIndemniteindWHEREind.indemniteAFacturer>:indemniteAFacturerANDind.avis.statut=:statutAND(:statut!=com.xx.xx.xx.domain.penalite.AvisPenaliteStatutEnum.POUR_FACTUREANDind.avis.facturationEnAttenteISTRUE'

Related issue in github: https://github.com/spring-projects/spring-data-jpa/issues/3376


Solution

  • I have gotten the same issue when referring to the same parameter twice in the query. Workaround is to either use two separate parameters, or in your case you could probably modify

     "AND (:statut != com.xx.xx.xx...
    

    to

     "AND (ind.avis.statut != com.xx.xx.xx...