[英]What is wrong with my native query in jpa?
我正在向數據庫發送一個非常簡單的查詢,但出現錯誤。 感覺就像我錯過了一些非常簡單的東西。 我想它不允許我創建它,因為單詞順序是 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"
}
您需要使用索引參數
@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);
當您查看日志時,更容易識別問題。 你會看到這樣的條目:
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
,其中
但我們希望它采用我們在@Table
中使用的名稱。 這在將屬性設置為spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
時有效。
不過,您的本機查詢將需要匹配的大小寫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.