2014-12-31 240 views
1

我工作的一个JavaEE应用,我有以下实体:JPA查询语法错误

@Entity 
public class EncMedicamento implements Serializable { 

    @Id 
    @GeneratedValue 
    private int cod_encomenda; 
    private Medicamento med; 
    private int unidades; 
    @Temporal(TemporalType.DATE) 
    private GregorianCalendar data_prevista; 
    @Temporal(TemporalType.DATE) 
    private GregorianCalendar data_encomenda; 

} 

当我试图让这个查询:

select e from EncMedicamento e where e.med like :m 

会发生错误。这里是完整的stacktrace:

Exception in thread "main" javax.ejb.EJBException 
at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748) 
at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:698) 
at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:503) 
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4566) 
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2074) 
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2044) 
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:212) 
at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:79) 
at com.sun.proxy.$Proxy235.criar_encomenda_medicamento(Unknown Source) 
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:483) 
at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:143) 
at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:173) 
at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatchToServant(ServerRequestDispatcherImpl.java:528) 
at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatch(ServerRequestDispatcherImpl.java:199) 
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequestRequest(MessageMediatorImpl.java:1549) 
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:1425) 
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleInput(MessageMediatorImpl.java:930) 
at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:213) 
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:694) 
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.dispatch(MessageMediatorImpl.java:496) 
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.doWork(MessageMediatorImpl.java:2222) 
at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497) 
at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540) 
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "LIKE" at line 1, column 146. 
Error Code: 30000 
Call: SELECT t1.COD_ENCOMENDA, t1.DATA_ENCOMENDA, t1.DATA_PREVISTA, t1.UNIDADES, t1.MED_COD_MEDICAMENTO FROM MEDICAMENTO t0, ENCMEDICAMENTO t1 WHERE (LIKE ? AND (t0.COD_MEDICAMENTO = t1.MED_COD_MEDICAMENTO)) 
bind => [1 parameter bound] 
Query: ReadAllQuery(referenceClass=EncMedicamento sql="SELECT t1.COD_ENCOMENDA, t1.DATA_ENCOMENDA, t1.DATA_PREVISTA, t1.UNIDADES, t1.MED_COD_MEDICAMENTO FROM MEDICAMENTO t0, ENCMEDICAMENTO t1 WHERE (LIKE ? AND (t0.COD_MEDICAMENTO = t1.MED_COD_MEDICAMENTO))") 
at org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedException(QueryImpl.java:378) 
at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:260) 
at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:469) 
at Sessions.HospitalManagement.criar_encomenda_medicamento(HospitalManagement.java:812) 
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:483) 
at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081) 
at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153) 
at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4786) 
at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:656) 
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608) 
at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:55) 
at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52) 
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:483) 
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883) 
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608) 
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163) 
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140) 
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:483) 
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883) 
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369) 
at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758) 
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746) 
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:205) 
... 19 more 
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "LIKE" at line 1, column 146. 
Error Code: 30000 
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:340) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:682) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:558) 
at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2002) 
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.executeSelectCall(DatasourceCallQueryMechanism.java:299) 
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:694) 
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2738) 
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2691) 
at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:495) 
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1168) 
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899) 
at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1127) 
at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:403) 
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1215) 
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896) 
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1804) 
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1786) 
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1751) 
at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258) 
... 52 more 
Caused by: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "LIKE" at line 1, column 146. 
at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source) 
at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source) 
at org.apache.derby.client.am.Connection.prepareStatement(Unknown Source) 
at com.sun.gjc.spi.base.ConnectionHolder.prepareStatement(ConnectionHolder.java:586) 
at com.sun.gjc.spi.jdbc40.ConnectionWrapper40.prepareCachedStatement(ConnectionWrapper40.java:255) 
at com.sun.gjc.spi.jdbc40.ConnectionWrapper40.prepareCachedStatement(ConnectionWrapper40.java:52) 
at com.sun.gjc.spi.ManagedConnectionImpl.prepareCachedStatement(ManagedConnectionImpl.java:992) 
at com.sun.gjc.spi.jdbc40.ConnectionWrapper40.prepareStatement(ConnectionWrapper40.java:173) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.prepareStatement(DatabaseAccessor.java:1556) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.prepareStatement(DatabaseAccessor.java:1505) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseCall.prepareStatement(DatabaseCall.java:778) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:619) 
... 72 more 
Caused by: org.apache.derby.client.am.SqlException: Syntax error: Encountered "LIKE" at line 1, column 146. 
at org.apache.derby.client.am.Statement.completeSqlca(Unknown Source) 
at org.apache.derby.client.net.NetStatementReply.parsePrepareError(Unknown Source) 
at org.apache.derby.client.net.NetStatementReply.parsePRPSQLSTTreply(Unknown Source) 
at org.apache.derby.client.net.NetStatementReply.readPrepareDescribeOutput(Unknown Source) 
at org.apache.derby.client.net.StatementReply.readPrepareDescribeOutput(Unknown Source) 
at org.apache.derby.client.net.NetStatement.readPrepareDescribeOutput_(Unknown Source) 
at org.apache.derby.client.am.Statement.readPrepareDescribeOutput(Unknown Source) 
at org.apache.derby.client.am.PreparedStatement.readPrepareDescribeInputOutput(Unknown Source) 
at org.apache.derby.client.am.PreparedStatement.flowPrepareDescribeInputOutput(Unknown Source) 
at org.apache.derby.client.am.PreparedStatement.prepare(Unknown Source) 
at org.apache.derby.client.am.Connection.prepareStatementX(Unknown Source) 
... 82 more 

可以请别人帮我找到我的查询中的错误?

+0

'Medicamento'是与另一张桌子的关系? –

+0

是的,这是另一张桌子 – Ghost

回答

3

下面是什么规格说JPQL LIKE表达应该像 -

string_expression [NOT] LIKE pattern_value [ESCAPE escape_character] 

我相信,在解析失败是因为e.med在查询不是一个字符串表达式,但结果类型的路径表达式 - Medicamento

您可以尝试的是 - where e.med.theFieldToCompare like :m(假设存在与Medicamento的关联)。