Hibernate复合主键查询MySQL视图返回空结果求助
问题:查询Hibernate生成的视图返回3行但全为null
我在MySQL中创建了一个视图,通过Maven的hbm2hbmxml插件生成了对应的hbm映射文件和POJO类。写了如下查询代码,执行后能返回3行结果,但所有对象都是null。已经花两天排查没找到解决方案,特来求助。
查询代码
public List<VListingdetail> getListingDomainByUserId(int userId) { Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = null; List<VListingdetail> listingDomains = new ArrayList<VListingdetail>(); try { transaction = session.beginTransaction(); String whereClause = "from VListingdetail where primaryfile=1 and userId='" + userId + "'"; Query result = session.createQuery(whereClause); List list = result.list(); for (Iterator it = list.iterator(); it.hasNext();){ listingDomains.add((VListingdetail)it.next()); } transaction.commit(); } catch (Exception e) { transaction.rollback(); e.printStackTrace(); } finally { session.close(); } return listingDomains; }
执行结果
返回3行但所有对象均为null:
相关文件截图
hbm映射文件:
POJO类文件:
排查方向建议
- 字段映射一致性检查:核对hbm文件里的
property标签的name(对应POJO属性)和column(对应视图字段)是否完全匹配,注意大小写差异,部分环境下Hibernate对字段名大小写敏感。 - 主键配置问题:Hibernate要求实体必须有唯一标识,视图如果没有天然主键,要确认hbm文件里的
id配置是否指向视图中唯一非空的字段;如果没有单一唯一字段,需要配置复合主键。 - HQL语法问题:你的HQL里把int类型的userId用单引号包裹成了字符串,虽然MySQL可能自动转换,但Hibernate解析时可能出现类型不匹配,建议改成:
from VListingdetail where primaryfile=1 and userId=" + userId - 数据类型兼容性:检查POJO属性类型和视图对应字段的MySQL数据类型是否兼容,比如视图里的字段是
varchar但POJO里用了int,会导致无法赋值。 - 映射文件完整性:确认hbm文件里是否配置了视图的所有必要字段,有没有遗漏或者错误配置的
property项。
内容的提问来源于stack exchange,提问作者Abdus Samad
相关产品推荐
相关产品推荐

