mysql - Hibernate 说不存在的列是未知的......显然

标签 mysql hibernate jpa spring-boot

我开始调整我的 spring boot 项目以使用 jpa/hibernate。在这个阶段,我只想检索 mysql 数据库中表的 id。

以下是相关类:

@SpringBootApplication
@ComponentScan(basePackages = {"rest.api.controller", "dao",     rest.api.model", "rest.api.config"})

public class Application {

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);

}

@Bean
public CommandLineRunner demo(PostRepository repository) {
    return (args) -> {
        // save a couple of customers
        repository.findAll();
    };
}

}

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

    private  String text;

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name="id")
    private long id;

    @Column(name="sender_id")
    private @JsonIgnore  long senderId;
    private @JsonIgnore  long eventId;
    private @JsonIgnore final String selectSql = " text, sender_id, event_id";

    protected Post() {}

    public Post(long id, float latitude, float longitude, Date created, String ip,
                String text, long senderId, long eventId) {
        this.text = text;
        this.senderId = senderId;
        this.eventId = eventId;
    }

    public Post(String text, long senderId, long eventId) {
        this.text = text;
        this.senderId = senderId;
        this.eventId = eventId;
    }

    public String getText() {
        return text;
    }

    public long getSenderId() {
        return senderId;
    }

    public long getEventId() {
        return eventId;
    }

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

public interface PostRepository extends CrudRepository<Post,  Long> {

}

还有 mysql 的 post 表:

CREATE TABLE `post` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `text` varchar(4096) NOT NULL,
  `sender_id` bigint(20) NOT NULL,
  `event_id` bigint(20) DEFAULT NULL,
  `created` datetime NOT NULL,
  `ip` varchar(20) NOT NULL,
  `latitude` float DEFAULT NULL,
  `longitude` float DEFAULT NULL,
  `deleted` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `post_sent_by_user` (`sender_id`),
  CONSTRAINT `post_sent_by_user` FOREIGN KEY 

我收到以下错误

2016-06-23 20:39:06.739  WARN 6895 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1054, SQLState: 42S22
2016-06-23 20:39:06.740 ERROR 6895 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : Unknown column 'post0_.select_sql' in 'field list'
2016-06-23 20:39:06.750  WARN 6895 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Warning Code: 1054, SQLState: 42S22
2016-06-23 20:39:06.751  WARN 6895 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : Unknown column 'post0_.select_sql' in 'field list'
2016-06-23 20:39:06.770 ERROR 6895 --- [           main] o.s.boot.SpringApplication               : Application startup failed

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:809) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:790) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:777) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at rest.api.Application.main(Application.java:16) [main/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_91]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_91]
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) [idea_rt.jar:na]
Caused by: org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:242) ~[spring-orm-4.2.6.RELEASE.jar:4.2.6.RELEASE]

在我的一生中,我无法弄清楚为什么它正在寻找一个具有“post0_.select_sql”这样奇怪名称的列 - 似乎与我的表或列完全无关。

我在谷歌上搜索了一段时间,但找不到任何东西来解释这一点。

如果有人能在这里帮助我,我将非常感激。 (我确信它应该很简单,因为我还没有真正尝试任何复杂的事情)

谢谢

最佳答案

因为你告诉 Hibernate 你的实体有一个这样命名的持久字段:

private @JsonIgnore final String selectSql

我不知道这个字段的用途以及为什么它在您的实体中,但它可能应该在其他地方,或者至少定义为常量(即设为静态)或在最开始至少用 @Transient 注释,以便 Hibernate 知道它不是持久属性的一部分。

关于mysql - Hibernate 说不存在的列是未知的......显然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38000881/

相关文章:

mysql - 如何在 Coffeescript 中创建 MySQL 数据库连接

PHP Mysql PDO 查询从 foreach 存储的多个值输出

eclipse - 在基于 Eclipse 插件的环境中运行 Hibernate

java - 实体管理器提交的性能不佳 - 指数

mysql - 如何按其他表值排序sql查询

php - 一种用python上传远程数据库数据的想法

oracle - hibernate native SQL 错误

hibernate - Apache Lucene 和 Hibernates 搜索出错

java - @Index 不适用于 JOINED 子类?

hibernate - Spring JPA、Hibernate 仅从其他实体获取 PK 或 Id