2012-01-28 18 views
0

私はJava EEアプリケーションを作成しようとしています。ビジネスレイヤーでは、選択クエリを実行します。MySQLのSQL構文エラー

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:[email protected]+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:[email protected]+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:[email protected]+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のワークベンチでのクエリを試してみましたが、それは完璧に働きました。

答えて

0

複数のステートメントを一度に実行しようとしています。それは可能ではありません。

最初に "set @row:= 0"を実行してから、2つの異なるステートメントを選択して試すことができます。

+1

'(SELECT @row:= 0)AS別名'副問い合わせ – Mchl

+0

私はそれを知らなかったことは実際には可能です。だからあなたはそれをSELECTのFROM部分に追加するか、それはどういう仕組みですか? – Joni

+0

はい、そうです。私は2つのステートメントを作成し、それは働いています。どうもありがとうございました! – tungi52