MySQL SQL синтаксическая ошибка - PullRequest
0 голосов
/ 28 января 2012

Я пытаюсь создать приложение JAVA EE. На бизнес-уровне я хочу выполнить запрос выбора. Вот основная часть метода выбора:

Query q = entityManager.createNativeQuery(
                "set @row:=0;\n" +
                "SELECT XA.ID, XA.Name, XA.UploadDate, XA.TopicID, XA.Title, XA.Description, " +
                "XA.ImageURL, XA.ShortDesc, XA.ExpirationDate, XA.IsActive, XA.Topic\n" +
                "FROM (\n" +
                    "SELECT Advertisement.*, Topic.Topic, " +
                        "@row:=@row+1 AS RowNum, NickName as Name\n" +
                    "FROM Advertisement, ad_User, Topic\n" +
                    "WHERE Advertisement.Uploader = ad_User.UserID AND Topic.ID = Advertisement.TopicID " +
                    SearchConstraints.createSQL(constraints) + onlyActive + "\n" +
                ") AS XA\n" +
                "WHERE XA.RowNum BETWEEN ?1 AND ?2\n"+
                "ORDER BY XA.ID DESC;");
q.setParameter(1, from);
q.setParameter(2, to);

List<Object[]> result = q.getResultList();

и выдает эту ошибку:

Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT XA.ID, XA.Name, XA.UploadDate, XA.TopicID, XA.Title, XA.Description, XA.I' at line 2
Error Code: 1064
Call: set @row:=0;
SELECT XA.ID, XA.Name, XA.UploadDate, XA.TopicID, XA.Title, XA.Description, XA.ImageURL, XA.ShortDesc, XA.ExpirationDate, XA.IsActive, XA.Topic
FROM (
SELECT Advertisement.*, Topic.Topic, @row:=@row+1 AS RowNum, NickName as Name
FROM Advertisement, ad_User, Topic
WHERE Advertisement.Uploader = ad_User.UserID AND Topic.ID = Advertisement.TopicID  AND IsActive = 1
) AS XA
WHERE XA.RowNum BETWEEN ? AND ?
ORDER BY XA.ID DESC;
    bind => [2 parameters bound]
Query: DataReadQuery(sql="set @row:=0;
SELECT XA.ID, XA.Name, XA.UploadDate, XA.TopicID, XA.Title, XA.Description, XA.ImageURL, XA.ShortDesc, XA.ExpirationDate, XA.IsActive, XA.Topic
FROM (
SELECT Advertisement.*, Topic.Topic, @row:=@row+1 AS RowNum, NickName as Name
FROM Advertisement, ad_User, Topic
WHERE Advertisement.Uploader = ad_User.UserID AND Topic.ID = Advertisement.TopicID  AND IsActive = 1
) AS XA
WHERE XA.RowNum BETWEEN ? AND ?
ORDER BY XA.ID DESC;")
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:644)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:535)
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1702)
    at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:253)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:207)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:264)
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelect(DatasourceCallQueryMechanism.java:246)
    at org.eclipse.persistence.queries.DataReadQuery.executeNonCursor(DataReadQuery.java:197)
    at org.eclipse.persistence.queries.DataReadQuery.executeDatabaseQuery(DataReadQuery.java:152)
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:829)
    at org.eclipse.persistence.queries.DataReadQuery.execute(DataReadQuery.java:137)
    at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:728)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2863)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1501)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1483)
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1457)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:485)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getResultList(EJBQueryImpl.java:742)
    at com.duonca.adportal.AdPortalBean.getAdvertisements(AdPortalBean.java:57)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5366)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370)
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5338)
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5326)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214)
    ... 39 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT XA.ID, XA.Name, XA.UploadDate, XA.TopicID, XA.Title, XA.Description, XA.I' at line 2
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2293)
    at com.sun.gjc.spi.jdbc40.PreparedStatementWrapper40.executeQuery(PreparedStatementWrapper40.java:642)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:931)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:607)
    ... 80 more

Я пробовал запрос в MySQL, и он работал отлично. Есть идеи?

1 Ответ

0 голосов
/ 28 января 2012

Вы пытаетесь выполнить несколько операторов за один раз. Это невозможно.

Вы можете попробовать выполнить сначала "set @row: = 0", а затем select, но в виде двух разных операторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...