【问题标题】:How to convert this SQL statement to HQL如何将此 SQL 语句转换为 HQL
【发布时间】:2023-03-12 08:44:01
【问题描述】:

我得到以下 SQL 语句:

SELECT p.category_id, COUNT(p.id)
FROM products p
WHERE p.name ILIKE 'product%'
GROUP BY p.category_id

我想将其转换为该实体的 HQL:

产品:

private Long id;

@NotNull
private String name;

@NotNull
private String description;

@NotNull
private String image;

@NotNull
private Double price;

@ManyToOne
private Category category;

我得到的是:

@Query("SELECT p.category.id, COUNT(p.id) " +
        "FROM Product p " +
        "WHERE p.name LIKE ?1 " +
        "GROUP BY p.category.id")
List<SearchDetail> findSearchDetailsByName(String phrase);

但它给了我以下错误: https://pastebin.com/h4yBPc7d

【问题讨论】:

  • 首先你用的是spring data吗?否则你查询的应该看起来像@Query(nativeQuery = true, value="SELECT p.category_id, COUNT(p.id) as var FROM products p WHERE p.name LIKE: name GROUP BY p.category_id") List&lt;SearchDetail&gt; findSearchDetailsByName(@Param("name")String phrase);
  • 您的 SearchDetail 是一个 jpa 实体?还是只是一个简单的pojo?
  • 当然我使用的是 spring-data,这是我的存储库:pastebin.com/S96Bcgvm 并且 SearchDetail 是一个 POJO:pastebin.com/Hnfnd2ra

标签: postgresql hibernate spring-boot hql


【解决方案1】:

试试这个:

@Query("SELECT new com.cm.sb.SearchDetail(p.category.id as category, COUNT(p.id) as count)  " +
            "FROM Product p " +
            "WHERE p.name LIKE ?1 " +
            "GROUP BY p.category.id")
    List<SearchDetail> findSearchDetailsByName(String phrase);

如您所见,您必须在查询中指定 SearchDetail 的包。

Nb:我已经测试了这个解决方案并且它有效:)

【讨论】:

    【解决方案2】:

    我认为您可能只需要为查询中与SearchDetail pojo 中的字段名称匹配的选定列提供别名:

    @Query("SELECT p.category.id AS category, COUNT(p.id) AS count" +
        "FROM Product p " +
        "WHERE p.name LIKE ?1 " +
        "GROUP BY p.category.id")
    List<SearchDetail> findSearchDetailsByName(String phrase);
    

    【讨论】:

    • 不行,还是一样的错误:Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Product is not mapped [SELECT p.category.id AS category, COUNT(p.id) AS count FROM Product p WHERE p.name LIKE ?1 GROUP BY p.category.id]
    • 该错误消息看起来您没有映射的Product 实体,您的Product 类是什么样的?
    猜你喜欢
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多