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
相关产品推荐
相关产品推荐

