Hibernate常见需求、问题、异常整理(持续更新)

1.org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join!

错误原因

Hibernate不认识join,换成","就可以了

错误示例

String sql="select a,b.userlogo from AnswerPost  a left join User b where  a.answer_name=b.username and a.post_id=?";

正确示例

String sql="select a,b.userlogo from AnswerPost  a , User b where  a.answer_name=b.username and a.post_id=?";

//==================================================

2.Unable to locate appropriate constructor on class

检查在实体类中是否有全参构造器,各属性名称、类型是否匹配

//==================================================

3.hibernate hql 查询指定字段/对象并获取结果集,多表查询结果集

在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况: 
1.查询全部字段的情况下,如"from 实体类",list中封装的对象为实体类本身,各属性都将得到填充。 
2.只查询一个字段,默认情况下,list中封装的是Object对象。 
3.查询两个或两个以上的字段,默认情况下,list中封装的是Object[],长度与所查询的字段数一致。 
对于后两种情况,用标签遍历时不太方便,因为无法直接转换成实体类的对象。比较简单的解决方法是: 
の:在hql中使用select new 包名.类名(属性1,属性2……) from 实体类,同时在实体类中添加带参的构造方法,参数的个数和顺序与(属性1,属性2……) 保持一致,这样我们得到的list中存放的依然是实体类的对象,所查询到的属性得到了填充,使用起来更为方便。 
の:hql查询多表部分字段,select new 包名.表1实体类名(表1.属性1,表2.属性2……) from 表1实体类,表2实体类 where 表1.ID=表2.ID(即相关联的字段)同时在要返回的表1实体类中添加表2的属性和带参的构造方法,参数的个数和顺序与(表1.属性1,表2.属性 2……) 保持一致 

//==================================================

4.Hibernate查询部分字段(含外键)出错,报空指针异常

假设当前表结构如下:

  food表字段有foodid,name,外键businessid,外键type

  business表字段有,name,外键type

需要查询food表部分字段,如name和外键businessid

则可在Food类中添加只有相应成员变量的构造方法,Food(String name,Business business)

select new Food(name,business) from Food where foodid=1

以上可以顺利查询,但是如果调换name和business顺序,使用Food(Business business,String name)

select new Food(business, name) from Food where foodid=1

就会报空指针异常

这其实是因为外键的关联表Business中也含有叫name的字段,所以会发生错误,此时只要给查询表使用别名就可以解决了.

select new Food(f.business, f.name) from Food f where foodid=1

另:空指针语句:

select new Food(name,business,type) from Food where foodid=1

改正语句(f.):

select new Food(f.name,f.business,f.type) from Food f where f.foodid=1

5.原生SQL映射属性报错:ResultSet和setter报错:

1.
org.hibernate.exception.SQLGrammarException: could not extract ResultSet

数据库字段名对应不上(也就是sql应该用数据库字段名而不是类的属性名)

2.
org.hibernate.PropertyNotFoundException: Could not find setter for business_line on class com.

缺少setter方法:.createSQLQuery(..as 别名...).addScalar("别名")或者别名as(user_name as 'userName')

6.原生SQL映射表名报错(如表名t_sys_user,实体类名SysUser):

1.使用实体类名:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table '库名.表名(sysuser:自动转小写)' doesn't exist

2.使用表名:org.hibernate.hql.internal.ast.QuerySyntaxException: t_pm_project_approval is not mapped [select  p.id as id, ...

一个犹豫:既然是原生SQL,就不要犹豫使用实体类名还是表名,统一使用表字段,网上一些称使用实体类名解决的方案很可能是情况不一样,还有可能只是凑巧,并不是真正理解的解决问题(比如实体类名User和表名user,这时使用实体类名自动转小写为user正好匹配表名)!

3.如果仍然报错,看看是不是后面跟有相同sql的其他操作,比如分页查询是数据查询和分页查询,换句话说,单点调试跟进去确认报错位置!

//==================================================

持续更新

参考:

https://blog.csdn.net/qq_37591637/article/details/88910067

https://blog.csdn.net/leandzgc/article/details/21190953

https://www.cnblogs.com/QQParadise/articles/3437940.html

发布了65 篇原创文章 · 获赞 8 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/u012382791/article/details/99671292