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

时间:2016-06-23 20:06:51

标签: mysql hibernate jpa spring-boot

我开始调整我的spring启动项目以使用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> {

}

和post表的mysql:

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]

对于我的生活,我无法弄清楚为什么它正在寻找一个像这样一个古怪名字的专栏&#34; post0_.select_sql&#34; - 似乎与我的桌子或专栏无关。

我用google搜索了一段时间,但找不到任何解释这一点。

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

由于

1 个答案:

答案 0 :(得分:0)

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

private @JsonIgnore final String selectSql

我不知道这个字段是什么以及为什么它在你的实体中,但它应该在其他地方,或者至少被定义为一个常量(即static)或者至少被注释为@Transient以便Hibernate知道它不是持久属性的一部分。