我是 Spring-boot 的新手。我创建了一个简单的 JPA 应用程序,它使用 web
和 H2
以及 JPA
依赖项。我想要使用 h2 嵌入数据库并使用 JPA 进行连接并提出一些请求。
我在 schema.sql
中创建了本地表并放置了以下代码:
drop TABLE if EXISTS stock;
CREATE TABLE stock(stockId INT ,companyName VARCHAR(20),price DECIMAL (10,2)
);
INSERT INTO stock VALUES (1,'apple',345.01);
INSERT INTO stock VALUES (2,'google',8999.00);
INSERT INTO stock VALUES (3,'kashky',56.60);
我还像这样创建了股票:
@Entity
public class Stock {
@Id
private int stockId;
private String companyName;
private double price;
... with all setter and getters
}
这是我的application.properties
spring.jpa.hibernate.ddl-auto=none
server.port=9090
Java 持久性查询语言 (JPQL) 不起作用,但当我更改为 native 查询时,它工作正常。
这段代码应该返回我的所有记录,但不起作用:
@SpringBootApplication
@RestController
public class SpringDataTestApplication {
@Autowired
private EntityManager em;
@RequestMapping("/stocks")
public List<Stock> stocks(){
return em.createQuery("select s from Stock s").getResultList();
}
如果我将查询更改为 native 模式,它就可以工作:
@RequestMapping("/stocks")
public List<Stock> stocks(){
return em.createNativeQuery("select * from Stock").getResultList();
}
这是错误:
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Wed Jan 25 12:51:38 IRST 2017
There was an unexpected error (type=Internal Server Error, status=500).
org.hibernate.exception.SQLGrammarException: could not prepare statement
为什么会发生这种情况?我认为我在 JPA 方面遇到了一些问题,因为后来我什至无法使用我在代码中没有提到的 StockRepository
,但我认为所有这些都是链接在一起收集的。
最佳答案
我猜您需要在 application.properties 文件中添加方言信息,例如对于 hibernate :
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
我猜 spring 有它自己的旋钮来完成这项任务。了解了方言,您的程序就知道要创建的 SQL 的“风格”。原生 SQL 可以工作,因为无需进行任何转换。
关于java - Spring 启动: JPA query (JPQL) do not work but works when change to native query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41847809/