Hibernate对多个表进行查询,结果集的处理方式
Hibernate对多个表进行查询时,
查询结果是多个表的笛卡尔积,或者称为“交叉”连接。例如:
from Student, Book
from Student as stu, Book as boo
from Student stu, Book boo
注意:让查询中的Student和Book均是表student和book对应的类名,它的名字一定要和类的名字相同,包括字母的大小写。别名应该服从首字母小写的规则是一个好习惯,这和Java对局部变量的命名规范是一致的。
建议通过MyEclipse进行生成这样就不会出太多的错注意表名要与类名同名
下面列举一个完整的例子来说明Hibernate对多个表进行关联查询(其中粗体是我们要特别注意的地方,相应表tBookInfo和BookSelection的结构和其对应的hbm.xml、class文件就不一一列举了,有需要详细了解的朋友,请联系我):
String sTest = "from tBookInfo book, BookSelection sel where book.id = sel.bookId";
Collection result = new ArrayList();
Transaction tx = null;
try {
Session session = HibernateUtil.currentSession();
tx = session.beginTransaction();
Query query = session.createQuery(sql);
result = query.list();
tx.commit();
} catch (Exception e) {
throw e;
} finally {
HibernateUtil.closeSession();
}
ArrayList sList = (ArrayList) result;
Iterator iterator1 = sList.iterator();
while (iterator1.hasNext()) {
Object[] o = (Object[]) iterator1.next();
tBookInfo bookInfo = (tBookInfo) o[0];
BookSelection bookSelect = (BookSelection) o[1];
System.out.println("BookInfo-Title: " + bookInfo.getTitle());
System.out.println("BookSelection-BookSelectionId: " + bookSelect.getId());
}
public List queryResoursOut() {
log.debug("queryResoursOut instance");
List list = new ArrayList();
ScrollableResults srs = null;
Session session = null;
try {
session = getSession();
srs = session.createQuery(
"select m.cname , t.cname , o.price , o.quantity "
+ "from ResourceModel m, ResourceType t, ResourceExist o"
+ " where m.id = o.modid and t.id = o.typeid and m.delflag ='0' and t.delflag = '0' order by o.typeid ").scroll();
// 将查询结果放入List保存
while (srs.next()) {
list.add(new ResourceOutTemp(srs.getString(0),
srs.getString(1), srs.getFloat(2), srs.getLong(3)));
}
} catch (HibernateException he) {
if (srs != null) {
try {
srs.close();
} catch (Exception e) {
;
}
}
} finally {
try {
session.close();
} catch (Exception e) {
;
}
}
return list;
}

提供的类,它可以为我们定制过虑输出列。

浙公网安备 33010602011771号