之前一直都是用hibernate的 hql 面向对象的查询思路 查询出来的都是具体的实体类的集合,这几日查询了一下相关资料,手动解析 createSQLQuery 和 createQuery 返回值。
原来 createSQLQuery 和 createQuery 返回都市 Object[] 型的 List ,这样一来就知道如何解析了。
举一个简单的例子:
有3张表 2个主表 1个中间表(符合主键)
Table 1
手机信息表t_phone
主要字段 PhoneId,PhoneName
Table 2
类型表 t_phone_type
主要字段 TypeId, TypeName
Table 3
手机类型中间表(符合主键)t_phone_type_lk
字段 TypeId, PhoneId
java具体代码如下
public List findDate(){ // String sql="SELECT p.phoneId,p.PhoneName,t.TypeId,t.TypeName " + // "FROM t_phone p, t_phone_type_lk ptlk, t_phone_type t " + // "WHERE p.phoneId = ptlk.phoneId and ptlk.typeId = t.typeId " + // "and p.phoneId = ? and t.TypeFatherId = 21"; String hql = "SELECT p.phoneId,p.phoneName,t.typeId,t.typeName " + "FROM TPhone p,TPhoneTypeLk ptlk, TPhoneType t " + "WHERE p.phoneId = ptlk.id.phoneId and ptlk.id.typeId = t.typeId " + "and p.phoneId = ? "; Session session = null; List<Object[]> res = new ArrayList<Object[]>(); session= getSession(); // res = session.createSQLQuery(sql).setParameter(0, 2).list(); res = session.createQuery(hql).setInteger(0, 2).list(); session.close(); System.out.println("获得list size:"+res.size()); return res; }
注释掉的事 sql 语句的查询 其结果可以使用通用的方法进行解析
以下是用Junit 4 进行测试的方法
@Test public void testFindDate() { List enlist = new Vector(); enlist = tplkDao.findDate(); for (Object obj : enlist) { Object[] res = (Object[]) obj; for (Object datas : res) { System.out.print(datas+"\t"); } System.out.print("\n"); } System.out.println("Test 返回list 大小"+ enlist.size()); }
测试结果如下