Hibernate使用总结
hibernate 实现多表连接查询结果处理
因多表连接查询在项目中用的比较多,且查询结果集不与任何一个实体类对应,怎么解决呢?
1,传统方式
查询并返回各个表的字段,调用query.List(),这个List是一个Object[]值,之后循环获取数组中的各个值,也就是说这里需要自己手动获取封装数据,基本代码如下:
List result = q.list();
Iterator it = result.iterator();
while (it.hasNext()) {
Object[] tuple = (Object[]) it.next();
Members members = (Members) tuple[ 0 ];
String className = (String) tuple[ 1 ];
}
2,构造自己的复合类型
a,添加一个映射类
eg:新建一个映射类UserWithRole,需要带属性的构造函数;
HQL = SELECT NEW UserWithRole(U.ID,U.NAME,R.NAME) FROM User U, ROLE R WHERE ......;
b,不添加映射类,直接使用已有实体类,添加需要的构造函数;
HQL = SELECT NEW User(U.ID,U.NAME,R.NAME) FROM User U, ROLE R WHERE ......;
SQL中UserWithRole/User(U.ID,U.NAME,R.NAME)的字段数就是UserWithRole/User类中的构造函数,
这里需要注意使用时可能会报异常:Unable to locate appropriate constructor on class
出现这个异常需要检查以下几种情况:
1)参数构造器的参数类型是否正确
2)参数构造器的顺序和hql中的顺序是否一致
3)参数构造器的参数个数是否和hql中的个数一致
4)参数构造器的参数类型是否TimeStamp
其中第4种情况较为复杂,需要做特殊处理:
基本代码如下:
HQL = SELECT NEW EXAMPLE(E.ID,A.NAME,A.DATE,A.EMAIL) FROM EXAMPLE E, ATABLE A WHERE .....;
实体:
public class Example{
private TimeStamp date;
//其他属性这里省略...
//需要注意其构造函数
public Example(Long id, String name, Object date, String email){
this.id = id;
this.name = name;
this.date = StringUtls.stringToTimeStamp(date.toString());//注意:这里需要将Object转换成TimeStamp;
}
}
本文最后有借鉴之处:http://blog.sina.com.cn/s/blog_4ad7c2540102uzkc.html