spring 我在jpa中的原生查询有什么问题?

eyh26e7m  于 2024-01-05  发布在  Spring
关注(0)|答案(2)|浏览(228)

我正在向数据库发送一个非常简单的查询,但是我得到了一个错误。感觉好像我错过了一些非常简单的东西。我想它不允许我创建它,因为词序是h2 db上的一个关键字,所以我把它放在表注解的引号中。

  1. @Query(value = "select * from `ORDER` o where o.basket_id= :basketId ", nativeQuery = true)
  2. Optional<Order> getOrderByBasketId(Long basketId);
  1. @Entity
  2. @Getter
  3. @Setter
  4. @Table(name = "`ORDER`")
  5. public class Order extends BaseExtendedModel{
  6. private BigDecimal price;
  7. @Enumerated(EnumType.STRING)
  8. private OrderStatus orderStatus;
  9. @OneToOne
  10. private Customer customer;
  11. @OneToOne(cascade = CascadeType.MERGE)
  12. private Basket basket;
  13. @OneToOne(cascade = CascadeType.ALL, mappedBy = "order")
  14. private OrderAddress orderAddress;
  15. }
  1. {
  2. "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"
  3. }
to94eoyn

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

  • 用下划线替换点
  • 将CamelCase更改为snake_case
  • 小写表格名称。

但是我们希望它采用我们在@Table中使用的名称。这在将属性设置为spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl时有效。
你的本地查询需要匹配的大小写。

展开查看全部
pgccezyw

pgccezyw2#

您需要使用索引参数

  1. @Query(value = "select * from `ORDER` o where o.basket_id= ?1", nativeQuery = true)
  2. Optional<Order> getOrderByBasketId(Long basketId);

字符串
或命名参数

  1. @Query(value = "select * from `ORDER` o where o.basket_id= :basketId", nativeQuery = true)
  2. Optional<Order> getOrderByBasketId(@Param("basketId") Long basketId);

相关问题