我开始调整我的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搜索了一段时间,但找不到任何解释这一点。
如果有人能在这里帮助我,我将非常感激。 (我确定它应该很简单,因为我还没有尝试任何复杂的东西)
由于
答案 0 :(得分:0)
因为你告诉Hibernate你的实体有一个以这种方式命名的持久字段:
private @JsonIgnore final String selectSql
我不知道这个字段是什么以及为什么它在你的实体中,但它应该在其他地方,或者至少被定义为一个常量(即static
)或者至少被注释为@Transient
以便Hibernate知道它不是持久属性的一部分。