为何SQL查询在Workbench运行正常但在集成Hibernate的IDE中无法运行
1. 字段歧义引发解析失败
你写的查询语句中lake_id字段存在于pegs表,而lakes表的主键id也是关联的湖ID,同时你给lakes表声明了别名l但后续没有使用。MySQL Workbench运行时会自动按上下文默认匹配字段,但是Hibernate的SQL解析器逻辑更严格,遇到歧义字段时会直接抛出异常,不会做猜测匹配。
解决办法:给所有存在歧义的字段加上表名/别名前缀,修改后的SQL参考:
select reservations.user_id, reservations.start_day, reservations.end_day, pegs.lake_id, pegs.peg_number from reservations left join pegs on reservations.peg_id = pegs.id left join lakes l on pegs.lake_id = l.id where pegs.lake_id = :lakeId
如果你实际需要取lakes表的其他字段,直接加l.前缀即可,比如l.name as lake_name。
2. 查询类型配置错误
如果你是在Spring Data JPA的@Query注解中写的这段SQL,没有加nativeQuery = true配置的话,Hibernate会默认按HQL语法解析,自然执行失败。
解决办法:补充原生查询配置,示例如下:
@Query(value = "上面修改后的完整SQL语句", nativeQuery = true) List<自定义结果接收类> 你的查询方法名(@Param("lakeId") Long lakeId);
3. 结果集映射不匹配
如果SQL执行没有报错但返回空或者字段为null,大概率是用来接收返回值的实体类/VO类,字段名和查询返回的字段名不匹配,或者缺少公开无参构造、对应字段的getter/setter方法。
解决办法:要么修改接收类的字段名和查询返回字段完全一致,要么在SQL中用as关键字给查询字段起别名和接收类字段对应,同时保证接收类有符合要求的构造和读写方法。
4. HQL语法下字段名不匹配
如果你没有用原生查询,是按HQL逻辑执行的话,需要写实体类的属性名,而不是数据库表的字段名,比如数据库字段user_id对应的实体类属性如果是userId,就要把查询语句里的字段名替换成实体类属性名,同时关联关系也要用实体类的关联属性配置,不能直接写表外键关联。
内容的提问来源于stack exchange,提问作者Dawid Sieradzki

