No se puede acceder a la función definida por el usuario h2 en la cláusula select, pero funciona en la cláusula where.
He creado un proyecto de prueba separado para probar esta funcionalidad con una entidad de usuario simple que tiene atributos de id y nombre.
Archivo Schema.sql
Crear tabla usuario (
id Int Not Null Primary Key Auto_Increment,
nombre Varchar(50) Default Null
);
Crear alias TEST PARA
“com.example.demospringbootproject.h2.CustomH2.customTestFunction”;;
Crear alias ANOTHERTEST PARA
“com.example.demospringbootproject.h2.CustomH2.customAnotherTestFunction”;;
Clase de función CustomH2
Paquete com.example.demospringbootproject.h2;
Importar com.example.demospringbootproject.model.User;
Clase de función CustomH2
import com.example.demospringbootproject.model.User;
public class CustomH2 {
public static Integer customTestFunction(Integer id){
return id;
}
public static User customAnotherTestFunction(User user){
return user;
}
}
Repositorio de usuario
Query(“Select u From User u where TEST(u.id) = 1”)
Usuario repoFunction1();
@Query(“Select ANOTHERTEST(u) From User u where u.id = 1”)
Usuario repoFunction2();
La primera función de repositorio funciona bien.
La segunda función de repositorio genera este error:
java.lang.IllegalArgumentException: Validation failed for query for method public
abstract com.example.demospringbootproject.model.User
com.example.demospringbootproject.repository.UserRepository.repoFunction2()!
He intentado cambiar el nombre de schema.sql a import.sql pero obtengo el mismo resultado.
Mi versión de Spring Boot: 2.5.7.
Versión de Java: 1.8
Dependencia H2
davy.ai
Solución
El mensaje de error indica que la consulta JPQL en
repoFunction2()
no pudo ser validada.Al observar la consulta, parece que la función
ANOTHERTEST()
es la causa del error. Esta función toma un objetoUser
y devuelve el mismo objeto, lo cual no parece servir ningún propósito en esta consulta.Una solución sería simplificar la consulta eliminando la función
ANOTHERTEST()
y seleccionando al usuario directamente:Esto debería funcionar siempre y cuando exista un usuario con una
id
de 1 en la base de datos.Alternativamente, si la función
ANOTHERTEST()
es requerida para algún otro propósito, asegúrese de que esté funcionando correctamente y que su firma coincida con la declarada en el archivoschema.sql
.Además, asegúrese de que el método
com.example.demospringbootproject.h2.CustomH2.customAnotherTestFunction(User user)
esté anotado con@Function
del paqueteorg.springframework.data.jpa.repository.query
.Por último, como está utilizando H2 como base de datos en memoria, debería incluir la dependencia de prueba de h2 en lugar de solo la dependencia en tiempo de ejecución. Puede agregarlo de la siguiente manera:
Esto debería asegurar que las clases y funciones necesarias de H2 estén disponibles durante las pruebas.