Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPA中查询时出错_Java_Mysql_Jpa - Fatal编程技术网

Java 在JPA中查询时出错

Java 在JPA中查询时出错,java,mysql,jpa,Java,Mysql,Jpa,我在MySQL中创建了一个数据库,并在servlet中使用JPA访问数据库。这些是细节 实体名称->RegisteredUser 字段id,类型->整数 因此,根据我的查询,我试图找到id为1001的记录 EntityManager em = HibernateUtil.getInstance().getEntityManager(); Query q = em .createQuery("SELECT record FROM Registered

我在MySQL中创建了一个数据库,并在servlet中使用JPA访问数据库。这些是细节

  • 实体名称->RegisteredUser

  • 字段id,类型->整数

  • 因此,根据我的查询,我试图找到id为1001的记录

    EntityManager em = HibernateUtil.getInstance().getEntityManager();
            Query q = em
                    .createQuery("SELECT record FROM RegisteredUser record WHERE record.id = 1001");
            RegisteredUser r = (RegisteredUser) q.getSingleResult();    
    
    但在这样做时,我得到了以下错误

     javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: 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 '2 registered0_.id as id0_, registered0_.current_status as current2_0_, registere' at line 1
            at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1360)
            at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1288)
            at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:313)
            at com.aces.servlets.UserStatusServlet.getStatus(UserStatusServlet.java:193)
            at com.aces.servlets.UserStatusServlet.access$0(UserStatusServlet.java:188)
            at com.aces.servlets.UserStatusServlet$1.onComplete(UserStatusServlet.java:50)
            at org.apache.catalina.core.AsyncListenerWrapper.fireOnComplete(AsyncListenerWrapper.java:40)
            at org.apache.catalina.core.AsyncContextImpl.fireOnComplete(AsyncContextImpl.java:119)
            at org.apache.coyote.AsyncStateMachine.asyncPostProcess(AsyncStateMachine.java:190)
            at org.apache.coyote.AbstractProcessor.asyncPostProcess(AbstractProcessor.java:116)
            at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:593)
            at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
            at java.lang.Thread.run(Unknown Source)
        Caused by: org.hibernate.exception.SQLGrammarException: 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 '2 registered0_.id as id0_, registered0_.current_status as current2_0_, registere' at line 1
            at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:83)
            at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
            at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
            at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
            at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
            at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
            at com.sun.proxy.$Proxy54.executeQuery(Unknown Source)
            at org.hibernate.loader.Loader.getResultSet(Loader.java:1962)
            at org.hibernate.loader.Loader.doQuery(Loader.java:829)
            at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
            at org.hibernate.loader.Loader.doList(Loader.java:2447)
            at org.hibernate.loader.Loader.doList(Loader.java:2433)
            at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2263)
            at org.hibernate.loader.Loader.list(Loader.java:2258)
            at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470)
            at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
            at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:196)
            at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1161)
            at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
            at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:280)
            ... 12 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 '2 registered0_.id as id0_, registered0_.current_status as current2_0_, registere' at line 1
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
            at java.lang.reflect.Constructor.newInstance(Unknown Source)
            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 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
            at java.lang.reflect.Method.invoke(Unknown Source)
            at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
            ... 27 more
    
    我的实体类(由eclipse生成)


    提前感谢:)

    错误在您的查询中:

    SELECT record FROM RegisteredUser record WHERE record.id LIKE 1001;
    
    您使用
    record
    对两种不同的东西混淆了sql解释器。第一个用于列,第二个用于获取的行

    试试这个:

    SELECT * FROM RegisteredUser record WHERE record.id LIKE 1001;
    
    SELECT object(record) FROM RegisteredUser as record WHERE record.id = 1001
    
    另外,我相信像带有字符串的关键字一样,我不确定您的record.id是整数还是varchar


    如果您共享有关表的更多详细信息以及需要获取的确切内容,我可以提供更好的输入。

    错误在您的查询中:

    SELECT record FROM RegisteredUser record WHERE record.id LIKE 1001;
    
    您使用
    record
    对两种不同的东西混淆了sql解释器。第一个用于列,第二个用于获取的行

    试试这个:

    SELECT * FROM RegisteredUser record WHERE record.id LIKE 1001;
    
    SELECT object(record) FROM RegisteredUser as record WHERE record.id = 1001
    
    另外,我相信像带有字符串的关键字一样,我不确定您的record.id是整数还是varchar


    如果您分享有关表的更多详细信息以及需要获取的确切内容,我可以提供更好的输入。

    为了获取对象,您应该使用JPA对象(…)语法。 试试这个:

    SELECT object(record) FROM RegisteredUser as record WHERE record.id = 1001
    

    为了获得一个对象,您应该使用JPA对象(…)语法。 试试这个:

    SELECT object(record) FROM RegisteredUser as record WHERE record.id = 1001
    


    他说这是一个整数,所以我想
    record.id=1001
    是正确的+1id是一个整数。好吧,我删除了,我用了“=”来代替它,但我还是得到了相同的结果error@AshwinSurana您是否已从我提到的某个位置删除了“记录”错误:第1:8行:意外标记:*第1:8行:意外标记:*位于org.hibernate.hql.internal.antlr.HqlBaseParser.selectClause(HqlBaseParser.java:1256)这是JPQL,不是SQLQ他说这是一个整数,所以我想,
    record.id=1001
    是正确的+1id是一个整数。好吧,我删除了,我用了“=”来代替它,但我还是得到了相同的结果error@AshwinSurana您是否从我提到的一个地方删除了“记录”错误:第1:8行:意外标记:*第1:8行:意外标记:*位于org.hibernate.hql.internal.antlr.HqlBaseParser.selectClause(HqlBaseParser.java:1256)这是JPQL,非SQL从Hibernate打开SQL输出;我们只能看到一点点MySQL不喜欢的语句。你真的应该使用类型化查询;在这种情况下,如果您确实知道ID,您甚至可以直接转到
    em.find(RegisteredUser.class,Integer.valueOf(1001))
    。此外,您可以发布整个
    实体
    类吗?看起来Hibernate正在将SQL转换为MySQL对象所要处理的内容,可能是因为您有一个字段定义,这让它抱怨。@chrylis在尝试不同的事情一段时间后,我意识到问题不在于查询,而在于RegisteredUser r=(RegisteredUser)q.getSingleResult();如果我打印q.getResultList().size()的值,也不会这样做,我不会得到任何错误。表示查询语句绝对正确的操作系统从Hibernate打开SQL输出;我们只能看到一点点MySQL不喜欢的语句。你真的应该使用类型化查询;在这种情况下,如果您确实知道ID,您甚至可以直接转到
    em.find(RegisteredUser.class,Integer.valueOf(1001))
    。此外,您可以发布整个
    实体
    类吗?看起来Hibernate正在将SQL转换为MySQL对象所要处理的内容,可能是因为您有一个字段定义,这让它抱怨。@chrylis在尝试不同的事情一段时间后,我意识到问题不在于查询,而在于RegisteredUser r=(RegisteredUser)q.getSingleResult();如果我打印q.getResultList().size()的值,也不会这样做,我不会得到任何错误。如果
    RegisteredUser
    类是JPA实体,则表示查询语句绝对正确的操作系统。该片段的首选语法如图所示,
    从EntityType o中选择o
    。如果
    RegisteredUser
    类是JPA实体,则不需要。该片段的首选语法如图所示,
    从EntityType o中选择o