Intento almacenar el objeto Java en la base de datos localmente sin usar una base de datos externa. Para esto uso JDBC con H2 a través de Hibernate:
/** * @param connection the connection to set */ public static void setConnectionHibernate() { Properties connectionProps = new Properties(); connectionProps.put("user", "sa"); try { Class.forName("org.h2.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } url = "jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MODE=MySQL;"; }Guardo el PROCEDIMIENTO en String con este código:
static final String CREATE_PROCEDURE_INITPSEUDOS = "CREATE OR REPLACE PROCEDURE init_pseudos (MaxPseudo INT) BEGIN WHILE MaxPseudo >= 0 DO" + " INSERT INTO Pseudos (indexPseudo)" + " VALUES (MaxPseudo);" + " SET MaxPseudo = MaxPseudo - 1;" + " END WHILE;" + " END init_pseudos;";Y ejecuto la declaración con este código:
public static void initBaseDonneePseudos() { try (Connection connection = DriverManager.getConnection(url, connectionProps); Statement stmt = connection.createStatement()) { stmt.execute(RequetesSQL.CREATE_TABLE_PSEUDOS); stmt.execute(RequetesSQL.CREATE_PROCEDURE_INITPSEUDOS); stmt.execute(RequetesSQL.CREATE_FUNCTION_RECUPEREPSEUDO); stmt.execute(RequetesSQL.INIT_TABLE_PSEUDOS); } catch (SQLException e) { e.printStackTrace(); } }Ejecuto esta declaración de prueba a prueba:
@Nested class BaseDonneeInteractionTest { @BeforeEach public void setUp() { BaseDonnee.setConnectionHibernate(); } @Test void testInitBaseDonnee() { assertDoesNotThrow(() -> BaseDonnee.initBaseDonneePseudos()); } }pero me sale este error
No encontré el problema de la consulta, ¿alguien tiene la solución para resolver esto?
El problema es que en H2 no hay procedimientos o funciones explícitos como intentas definir.
Para ese propósito, H2 le permite crear funciones definidas usadas en su lugar. Por favor, considere leer la documentación correspondiente.
Básicamente, crea una función definida por el usuario declarando un ALIAS para un montón de código Java.
Por ejemplo, en su caso de uso, su CREATE_PROCEDURE_INITPSEUDOS podría verse similar a esto:
CREATE ALIAS INIT_PSEUDOS AS $$ import java.sql.Connection; import java.sql.Statement; import java.sql.SQLException; @CODE void init_pseudos(final Connection conn, final int maxPseudo) throws SQLException { try (Statement stmt = conn.createStatement()) { while (maxPseudo >= 0) do { stmt.execute("INSERT INTO Pseudos (indexPseudo) VALUES (MaxPseudo);"); maxPseudo = maxPseudo - 1; } } } $$;Tenga en cuenta lo siguiente:
$$ .java.util o java.sql en su código. Si desea incluir explícitamente algunas importaciones, o si necesita clases de otros paquetes además de los mencionados, las importaciones correspondientes deben proporcionarse justo después del primer token $$ . Además, debe incluir @CODE la señal H2 donde terminan sus importaciones y comienza su método Java real.Connection a la base de datos en su código, debería ser el primer argumento de su método.Puede invocar dicha función como de costumbre:
CALL INIT_PSEUDOS (5); Proporcione el valor apropiado para el argumento maxPseudo .
Por favor, considere el código provisto como solo un ejemplo de uso: puede mejorar el código de diferentes maneras, como usar PreparedStatement s en lugar de Statement s para fines de eficiencia, verificar los parámetros para la nulabilidad, etcétera.
El "Modo de compatibilidad de MySQL" no hace que H2 sea 100% compatible con MySQL. Solo cambia algunas cosas. La documentación los enumera:
Eso es todo. No hay nada acerca de los procedimientos. Como señaló @jccampanero en la otra respuesta, debe usar la sintaxis específica de H2 si desea crear procedimientos almacenados.