I'm pretty certain that this is an EclipseLink bug. It is generating the
wrong syntax to call a stored procedure (actually a user-defined function)
in H2.
The syntax is
CALL logProc()
and not
EXECUTE PROCEDURE logProc()
On Sunday, 1 May 2016 19:47:02 UTC+2, Szymon Kuryło wrote:
>
> Table definition (src/test/resources/db.sql):
> create table if not exists users(
> user_id identity primary key,
> user_name varchar
> );
>
> insert into users(user_name) values('John Doe');
> insert into users(user_name) values('Jane Doe');
>
> create alias if not exists logProc as $$
> void loglog() {
> System.out.println("Hello world!");
> }
> $$;
>
> Persistence.xml:
> <persistence-unit name="h2">
> <class>com.pany.User</class>
> <exclude-unlisted-classes>true</exclude-unlisted-classes>
> <properties>
> <property name="javax.persistence.jdbc.driver"
> value="org.h2.Driver" />
> <property name="javax.persistence.jdbc.url"
>
> value="jdbc:h2:mem:test;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1;INIT=runscript
>
> from 'src/test/resources/db.sql'" />
> <property name="eclipselink.jdbc.timeout" value="30" />
> <property name="eclipselink.target-database"
> value="org.eclipse.persistence.platform.database.H2Platform" />
> </properties>
> </persistence-unit>
>
> User class:
> package com.pany;
> import javax.persistence.*;
>
> @NamedStoredProcedureQuery(
> name = "log",
> procedureName = "logProc"
> )
> @Entity
> @Table(name = "users")
> public class User {
>
> @Id
> @GeneratedValue(strategy = GenerationType.IDENTITY)
> @Column(name = "user_id")
> public int userId;
>
> @Column(name = "user_name")
> public String userName;
> }
>
> Executing
> entityManager.createNamedStoredProcedureQuery("log").execute();
> or
> entityManager.createNamedQuery("log").getResultList();
> results in
>
> javax.persistence.PersistenceException: Exception [EclipseLink-4002]
> (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b):
> org.eclipse.persistence.exceptions.DatabaseException
> Internal Exception: org.h2.jdbc.JdbcSQLException: Function alias
> "PROCEDURE" not found; SQL statement:
> EXECUTE PROCEDURE logProc() [90077-191]
> Error Code: 90077
> Call: EXECUTE PROCEDURE logProc()
> Query: ResultSetMappingQuery(name="log" )
>
> at
> org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedException(QueryImpl.java:377)
> at
> org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:260)
> at
> org.eclipse.persistence.internal.jpa.StoredProcedureQueryImpl.execute(StoredProcedureQueryImpl.java:316)
> at com.pany.UserDao.log(UserDao.java:22)
> at com.pany.MainTest.test(MainTest.java:16)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:497)
> at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
> at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
> at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
> at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
> at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
> at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
> at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
> at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
> at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
> at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
> at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
> at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
> at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
> at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
> at
> com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)
> at
> com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
> at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:497)
> at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
> Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services -
> 2.5.0.v20130507-3faac2b):
> org.eclipse.persistence.exceptions.DatabaseException
> Internal Exception: org.h2.jdbc.JdbcSQLException: Function alias
> "PROCEDURE" not found; SQL statement:
> EXECUTE PROCEDURE logProc() [90077-191]
> Error Code: 90077
> Call: EXECUTE PROCEDURE logProc()
> Query: ResultSetMappingQuery(name="log" )
> at
> org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:340)
> at
> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:679)
> at
> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:558)
> at
> org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1995)
> at
> org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:570)
> at
> org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242)
> at
> org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228)
> at
> org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.execute(DatasourceCallQueryMechanism.java:220)
> at
> org.eclipse.persistence.queries.ResultSetMappingQuery.executeDatabaseQuery(ResultSetMappingQuery.java:291)
> at
> org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899)
> at
> org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:798)
> at
> org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2894)
> at
> org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1797)
> at
> org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1779)
> at
> org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1744)
> at
> org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258)
> ... 29 more
> Caused by: org.h2.jdbc.JdbcSQLException: Function alias "PROCEDURE" not
> found; SQL statement:
> EXECUTE PROCEDURE logProc() [90077-191]
> at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
> at org.h2.message.DbException.get(DbException.java:179)
> at org.h2.message.DbException.get(DbException.java:155)
> at org.h2.command.Parser.parseExecute(Parser.java:1634)
> at org.h2.command.Parser.parsePrepared(Parser.java:387)
> at org.h2.command.Parser.parse(Parser.java:315)
> at org.h2.command.Parser.parse(Parser.java:287)
> at org.h2.command.Parser.prepareCommand(Parser.java:252)
> at org.h2.engine.Session.prepareLocal(Session.java:560)
> at org.h2.engine.Session.prepareCommand(Session.java:501)
> at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188)
> at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:73)
> at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:276)
> at
> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.prepareStatement(DatabaseAccessor.java:1551)
> at
> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.prepareStatement(DatabaseAccessor.java:1500)
> at
> org.eclipse.persistence.internal.databaseaccess.DatabaseCall.prepareStatement(DatabaseCall.java:778)
> at
> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:619)
> ... 43 more
>
> I'm using example from
> http://wiki.eclipse.org/EclipseLink/Examples/JPA/StoredProcedures#Using_.40NamedStoredProcedureQuery_to_define_a_stored_procedure
> .
> Eclipselink version: 2.5.0 (same happens with the newest 2.6.3-M1)
> Is there something wrong with my code, or is H2 database not fully
> supported?
>
--
You received this message because you are subscribed to the Google Groups "H2
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.