我正在向数据库发送一个非常简单的查询,但是我得到了一个错误。感觉好像我错过了一些非常简单的东西。我想它不允许我创建它,因为词序是h2 db上的一个关键字,所以我把它放在表注解的引号中。
@Query(value = "select * from `ORDER` o where o.basket_id= :basketId ", nativeQuery = true)
Optional<Order> getOrderByBasketId(Long basketId);
@Entity
@Getter
@Setter
@Table(name = "`ORDER`")
public class Order extends BaseExtendedModel{
private BigDecimal price;
@Enumerated(EnumType.STRING)
private OrderStatus orderStatus;
@OneToOne
private Customer customer;
@OneToOne(cascade = CascadeType.MERGE)
private Basket basket;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "order")
private OrderAddress orderAddress;
}
{
"errorMessage": "could not prepare statement; SQL [select * from `ORDER` o where o.basket_id= ? ]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement"
}
2条答案
按热度按时间to94eoyn1#
当您查看日志时,问题更容易识别。您将看到这样的条目:
org.h2.jdbc.JdbcSQLSyntaxErrorException:找不到表“ORDER”; SQL语句:
让我们看看执行了哪些SQL语句。
spring.jpa.show-sql=true
假设你让spring Boot 创建你的表,你会看到以下内容:
Hibernate:drop table if exists“order”CASCADE Hibernate:create table“order”.
当我们调用repository方法时,
select * from
ORDER
o where o.name =?[42102-200]那么,为什么它要在MySQL中创建表,尽管我们指定了
@Table(name = "
ORDER")
?spring.jpa.hibernate.naming.physical-strategy
的默认值是org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
,但是我们希望它采用我们在
@Table
中使用的名称。这在将属性设置为spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
时有效。你的本地查询需要匹配的大小写。
pgccezyw2#
您需要使用索引参数
字符串
或命名参数
型