hibernate实现多表连接查询结果处理

本文详细探讨了Hibernate在多表连接查询时如何处理结果集,包括传统方式和自定义复合类型的方法,并提供了避免构造器异常的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值