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.

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


com.h2database
h2
runtime

Tags:  , , , ,

Answer

  1. Avatar for 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 objeto User 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:

    @Query("SELECT u FROM User u WHERE u.id = 1")
    User repoFunction2();
    

    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 archivo schema.sql.

    Además, asegúrese de que el método com.example.demospringbootproject.h2.CustomH2.customAnotherTestFunction(User user) esté anotado con @Function del paquete org.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:

    <dependency>
      <groupid>com.h2database</groupid>
      <artifactid>h2</artifactid>
      <scope>test</scope> <!-- cambiar runtime por test -->
    </dependency>
    

    Esto debería asegurar que las clases y funciones necesarias de H2 estén disponibles durante las pruebas.

Comments are closed.