java - 在 JPA 中查询时出错

标签 java mysql jpa

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

  1. 实体名称 -> 注册用户

  2. 字段 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生成)

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name="registered_users")
@NamedQuery(name="RegisteredUser.findAll", query="SELECT r FROM RegisteredUser r")
public class RegisteredUser implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private int id;

    @Column(name="current_status")
    private byte currentStatus;

    private String password;

    private String username;

    public RegisteredUser() {
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public byte getCurrentStatus() {
        return this.currentStatus;
    }

    public void setCurrentStatus(byte currentStatus) {
        this.currentStatus = currentStatus;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return this.username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

}

提前致谢:)

最佳答案

错误在您的查询中:

SELECT record FROM RegisteredUser record WHERE record.id LIKE 1001;

您将使用 record 的 sql 解释器混淆为两种不同的东西。第一个用于列,第二个用于获取的行。

试试这个:

SELECT * FROM RegisteredUser record WHERE record.id LIKE 1001;

我也相信LIKE关键字带字符串,我不确定你的record.id是整数还是varchar。

如果您分享更多关于您的表的详细信息以及您究竟需要获取什么,我可以提供更好的输入。

关于java - 在 JPA 中查询时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18296452/

相关文章:

php - 如何从 Laravel session 中删除数组

java - 使用亚马逊的 avs SDK for Alexa 解析音频文件

Mysql如何获取给定ID的父级和所有子级?

php - 有没有办法访问以前创建的 div?

java - MySQL java servlet 和 JPA

java - 为什么 Java 元编程支持不是更好?

java - 针对客户和员工的 Spring Security 用户身份验证

java - 在 IReport 中显示为 oracle.sql 的日期

java - 如何在java中将多个多边形合并为一个

spring - 来自组合 Spring 数据规范的查询在同一个表上有多个连接