【问题标题】:ERROR: Unknown column 'user0_.id' in 'field list'错误:“字段列表”中的未知列“user0_.id”
【发布时间】:2015-12-27 08:32:42
【问题描述】:

所以,我有两个处于一对多关系的表,当我尝试登录时,我收到有关某些 user0_id 字段的错误。问题是我只在触发错误时发送用户名和密码,所以我不确定是什么原因造成的。我读过关于这个问题的类似帖子,它似乎与实体和表之间的映射有关。所以,这是我的实体。

@Entity
@Table(name="user")
public class User {
    @Id
    @Column(name="id")
    @GeneratedValue
    private int id;
    @Column(name="email")
    private String email;
    @Column(name="username")
    private String username;
    @Column(name="password")
    private String password;
    @Column(name="authority")
    private String authority;
    @OneToMany(cascade={CascadeType.ALL})
    @JoinColumn(name="id")
    private List<Post> posts;

    ...

}

另一个:

@Entity
@Table(name="post")
public class Post {

    @Id
    @Column(name="id")
    @GeneratedValue
    private int id;
    @Column(name="title")
    private String title;
    @Column(name="content")
    private String content;

    @ManyToOne
    @JoinColumn(name="userId", insertable=false, updatable=false, nullable=false)
    private User user;

    ...
}

有人可以告诉我可能导致这种情况的原因吗?因为我看不出有什么不对,而且列和表之间的名字是一样的。

表格:

post
    1   id  int(11)         
    2   title   varchar(45)     
    3   content longtext    
    4   userId  int(11)         

user
    1   id  int(11)         
    2   email   varchar(45) 
    3   authority   varchar(45) 
    4   username    varchar(45) 
    5   password    varchar(45) 

错误:

    ERROR: Unknown column 'user0_.id' in 'field list'
org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2066)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1863)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839)
    at org.hibernate.loader.Loader.doQuery(Loader.java:910)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
    at org.hibernate.loader.Loader.doList(Loader.java:2554)
    at org.hibernate.loader.Loader.doList(Loader.java:2540)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
    at org.hibernate.loader.Loader.list(Loader.java:2365)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
    at com.personal.services.LoginService.login(LoginService.java:24)
    at com.personal.controllers.HomeController.login(HomeController.java:54)
    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.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:871)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'user0_.id' in 'field list'
    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:404)
    at com.mysql.jdbc.Util.getInstance(Util.java:387)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:939)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1962)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82)
    ... 54 more

【问题讨论】:

  • 你能把两张表的列贴一下吗
  • POST: 1 id int(11) 2 title varchar(45) 3 content longtext 4 userId int(11) USER: 1 id int(11) 2 email varchar(45) 3 authority varchar(45 ) 4 用户名 varchar(45) 5 密码 varchar(45)
  • 您不应该在两个实体中都使用连接列。在其中一个中,您应该使用 mappedBy。在用户类中,删除连接列并在 oneToMany 注释中添加 mappedBy="user"。试试这个并在这里发布它的结果
  • 一个小提示 - 您可以使用 bootify.io 创建您的 JPA / hibernate 实体而不会出现此类问题 :)

标签: spring hibernate


【解决方案1】:

我有类似的问题,但我认为它不会解决您的问题。我不得不将数据库列重命名为未知的列名。我的错误说的是“字段列表中的未知列'category_id'”。数据库中的列名是 categoryId。当我将其更改为 category_id 时,一切正常。

【讨论】:

    【解决方案2】:

    您的映射确实不正确。

    @OneToMany(cascade={CascadeType.ALL})
    @JoinColumn(name="id")
    private List<Post> posts;
    

    这没有任何意义。您是说帖子通过使用 post.id 列来引用用户。这不可能是正确的,因为 id 如果是 post 的主键。

    这也是不正确的,因为您需要双向 OneToMany 关联,因此一侧必须是关联的反面。

    这是正确的映射:

    @OneToMany(mappedBy="user", cascade={CascadeType.ALL})
    private List<Post> posts;
    

    在帖子中:

    @ManyToOne
    @JoinColumn(name="userId", nullable=false)
    private User user;
    

    【讨论】:

    • 我稍后会尝试。谢谢。
    • fk_post_user -> (column is usedId and table is post) -> (referenced table is user and referenced column is id)
    • 不要将您的表命名为 USER。这是一个保留字。 dev.mysql.com/doc/refman/5.7/en/keywords.html
    • 正如我所说:表 USER 的名称。
    • 正确。 MySQL 不知道也不关心您的实体的名称。
    猜你喜欢
    • 2018-05-12
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多