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

JPAQuery映射正常,JPASQLQuery报列未找到错误,求原因

问题原因分析

核心区别:两种Query的本质不同

  • JPAQuery是JPA查询语言(JPQL)的封装,基于你定义的Hibernate实体模型工作。当你写categoryEntity.parentCategory.id时,它会自动识别实体间的@ManyToOne关联,把这个属性路径转换成对应的SQL逻辑——即用C_PARENTCATEGORY列(对应parentCategory的外键)和4L做匹配,完全不需要你操心数据库列名的映射。
  • JPASQLQuery是原生SQL查询工具,直接对接数据库的表和列,不会识别Hibernate的实体关联映射。你写的categoryEntity.parentCategory.id会被它直接当成数据库里的嵌套列名(也就是错误提示里的categoryEntity.parentCategory.C_I_IDF),但你的数据库CATEGORY表根本没有这个嵌套结构,只有存储父类ID的C_PARENTCATEGORY列,所以数据库会报错找不到对应列。

结合你的实体类看问题

你的CategoryEntity里,parentCategory字段用@JoinColumn(name="C_PARENTCATEGORY")指定了外键列是C_PARENTCATEGORY,但JPASQLQuery不会解析这个注解,它只认你写的属性路径,自然找不到不存在的categoryEntity.parentCategory.C_I_IDF列。

可选的解决办法(如果要继续用JPASQLQuery)

直接用数据库的列名来写条件,比如:

return new JPASQLQuery<>(entityManager, new DB2Templates())
        .select(QCategoryEntity.categoryEntity)
        .from(QCategoryEntity.categoryEntity)
        .where(QCategoryEntity.categoryEntity.cParentcategory.eq(4L)) // 这里用Q类生成的对应列属性,比如cParentcategory对应C_PARENTCATEGORY
        .fetch();

或者直接写原生SQL表达式:

.where(Expressions.numberPath(Long.class, "categoryEntity.C_PARENTCATEGORY").eq(4L))

内容的提问来源于stack exchange,提问作者Bruno Vandekerkhove

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:40:42