簡體   English   中英

我在 jpa 中的本機查詢有什么問題?

[英]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 ,其中

  • 用下划線替換點
  • 將 CamelCase 更改為 snake_case
  • 小寫的表名。

但我們希望它采用我們在@Table中使用的名稱。 這在將屬性設置為spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl時有效。

不過,您的本機查詢將需要匹配的大小寫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM