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

