You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JPA NamedQuery转换PostgreSQL查询无结果问题求助

问题排查与解决步骤

1. 修正实体类的Schema与表名映射

原生SQL明确使用了testing schema下的表,但你的实体类未指定schema,且FactProd缺少表名映射,导致JPA访问了默认schema(如public)下的空表:

  • 给Producto实体的@Table添加schema配置:
@Entity
@Table(name = "producto", schema = "testing") // 匹配数据库表名,PostgreSQL默认小写
@XmlRootElement
// ... 其他注解
public class Producto implements Serializable {
    // ... 实体字段
}
  • 给FactProd实体添加完整的@Table注解,并指定schema:
@Entity
@Table(name = "fact_prod", schema = "testing")
public class FactProd implements Serializable {
    // ... 实体字段
}

2. 简化并修正JPQL查询

你的NamedQuery存在冗余条件,且分组逻辑可以优化:

修正后的@NamedQuery:

@NamedQueries({
    @NamedQuery(name = "Producto.findTop5ByFrecuencia", 
          query = "SELECT p FROM Producto p " +
                  "INNER JOIN p.factProdCollection f " +
                  "GROUP BY p.id " +
                  "ORDER BY COUNT(f) DESC")
})

关键修改点:

  • 移除了多余的WHERE p.id = f.productoId.id:INNER JOIN p.factProdCollection f已经通过实体关联(mappedBy = "productoId")建立了p与f的关联关系,该条件属于重复判断,可能导致过滤异常。
  • 简化GROUP BY子句:f.productoId本质就是当前的p,只需按p.id分组即可,符合JPA的分组规范。

3. 验证调用逻辑

你的查询调用代码是正确的,setMaxResults(5)对应原生SQL的LIMIT 5,无需修改。如果仍有问题,可以临时开启JPA的SQL日志(比如Hibernate的show_sql=true),对比生成的SQL与原生SQL的差异,进一步定位问题。

内容的提问来源于stack exchange,提问作者Luis Bermúdez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:50:55