用HQL语句查询实体类列表,返回结果List分为三种情况:
- 查询全部字段(from 实体类),默认List中封装实体类本身,所有属性都被填充;
- 只查询一个字段,默认List中封装Object对象;
- 查询两个或两个以上的字段,默认List中封装Object[],长度与指定查询字段数一致。
后两种情况无法直接转换成实体类的对象, 解决方法:
- 单表查询:HQL使用select new 包名.类名A(属性1,属性2,…) from 实体类A,同时必须在实体类添加带参的构造方法;
-
多表查询:HQL查询多表部分字段,select new 包名.A类名 (A.属性1,B.属性2,…) from A类名,B类名 where A.id = B.a.id,同时必须在要返回的A类中添加B类的属性(不想冗余可用@Transient注解)和带参的构造方法;
-
参数的个数和顺序与(属性1,属性 2,...)保持一致
一般不加包名(有异常那就加包名):
1.单表查询:
有包名
select new cn.java.domain.Comment(id, title, score) from Comment
不加包名
select new Comment(id, title, score) from Comment
2.多表查询
不加包名
select new Comment(a.id, a.title, a.score, b.dimensionName) from Comment a, CommentDetail b
where a.id = b.comment.id