我正在向資料庫發送一個非常簡單的查詢,但出現錯誤。感覺就像我錯過了一些非常簡單的東西。我想它不允許我創建它,因為單詞順序是 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"
}
uj5u.com熱心網友回復:
當您查看日志時,更容易識別問題。你會看到這樣的條目:
org.h2.jdbc.JdbcSQLSyntaxErrorException:找不到表“ORDER”;SQL 陳述句:
那么讓我們看看執行了哪些 SQL 陳述句。所以我們將以下內容添加到application.properties
spring.jpa.show-sql=true
假設您讓 spring boot 創建您的表,您將看到以下內容:
Hibernate:如果存在則洗掉表“order” CASCADE Hibernate:創建表“order” ...
當我們點擊存盤庫方法時,我們看到
select * from `ORDER` o where o.name= ? [42102-200]
那么為什么它創建小寫的表,即使我們指定了@Table(name = "`ORDER`")
?
的默認spring.jpa.hibernate.naming.physical-strategy
值為org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
,其中
- 用下劃線替換點
- 將 CamelCase 更改為 snake_case
- 小寫的表名。
但我們希望它采用我們在@Table
. 將屬性設定為spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
.
不過,您的本機查詢將需要匹配的大小寫。
uj5u.com熱心網友回復:
您需要使用索引引數
@Query(value = "select * from `ORDER` o where o.basket_id= ?1", nativeQuery = true)
Optional<Order> getOrderByBasketId(Long basketId);
或命名引數
@Query(value = "select * from `ORDER` o where o.basket_id= :basketId", nativeQuery = true)
Optional<Order> getOrderByBasketId(@Param("basketId") Long basketId);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/470363.html