【问题标题】:What's wrong with this JPA @Query?这个 JPA @Query 有什么问题?
【发布时间】:2020-12-12 10:50:39
【问题描述】:

我有一个 Spring Boot 应用程序,它使用 Spring Data JPA 与 H2 数据库连接。我尝试在我的JpaRepositories 之一中编写@Query 方法,但它总是返回一个空集合,我不知道为什么。

public interface ProductService extends JpaRepository<Product, Long> {
    @Query(value = "SELECT * FROM product WHERE category=':category'", nativeQuery = true)
    List<Product> getCategory(@Param("category") String category);
}

我只将这段代码放在上面,因为我确定数据存在于数据库中。我已经通过从 H2-console 运行这个完全相同的查询来验证它,并且它每次都有效。这可能是什么问题?

【问题讨论】:

  • 您不必将带有@param 注释的变量放在引号内。删除引号。所以 where 子句是这样的where category=:category

标签: sql spring database jpa h2


【解决方案1】:

使用纯 JPA:

List&lt;Product&gt; findAllByCategory(String category);

使用本机查询:

@Query(value="SELECT * FROM product WHERE category=?1;",nativeQuery=true)
List<Product> getAllByCategory(String category);
@Query(value="SELECT * FROM product WHERE category=:category;",nativeQuery=true)
List<Product> getAllByCategory(@Param String category);

我个人会使用 JPA 版本,因为您将来可能想要使用 Spring Paging 端点,因此希望将 Pageable 参数传递给 repo。

List&lt;Product&gt; findAllByCategory(String category,Pageable page);

【讨论】:

  • 我认为他传递参数的方式没有任何问题。它的引号
【解决方案2】:

你试过了吗

@Query(value = "SELECT * FROM product p WHERE p.category=:category", nativeQuery = true)

https://www.baeldung.com/jpa-query-parameters

【讨论】:

    【解决方案3】:

    您可以尝试为表提供别名并选择相同的别名而不是 *,如下所示

    @Query(value = "SELECT p FROM Product p WHERE p.category = :category")
    List<Product> getCategory(@Param("category") String category);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 2012-07-28
      • 2012-05-26
      • 2021-08-20
      相关资源
      最近更新 更多