1,与sql类似hql中也有左右连接和交叉连接,效果功能类似只是用法有稍微的差别,hql中不用on关键字,而是直接right join之前级联的对象即可,如下:
其中Person与Contact为一对多的关系,即一个人有多个联系方式的内容。再Contact中有属性person
hql右连查询,以右边的为准查出结果,
String hql=" from Contact contact Right JOIN contact.person person where 1=1 ";
hql左连查找,以左边的为准查结果,
String hql=" from Contact contact Left JOIN contact.person person where 1=1 ";
hql交叉连接,比较适合一对一的关系,如果是一对多当多的一方没有的话一的也查不出,比如如果某个人没有联系方式,那么在搜素的时候查不到这个人员。此种方式查询速度比较慢
String hql=" from Person person,Contact contact where person=contact.person ";
2,这里是为了搜索出符合条件的人员信息,用右关联;查询关键字param,不同的关键字之间用空格隔开,attribute数组里面存放需要用来匹配的属性名称
String hql=" from Contact contact Right JOIN contact.person person where 1=1 ";
log.info("param="+param);
StringBuffer buffer=new StringBuffer();
if(null!=param&&!"".equals(param)){
String[] attribute=new String[] {"person.username","person.depart",
"person.remark","contact.content"};
String[] strs=param.trim().split(" ");
for(int i=0;i<strs.length;i++) {
buffer.append(" and (");
for(int j=0;j<attribute.length;j++) {
if(j==0) {
buffer.append(attribute[j]+" like '%"+strs[i]+"%'");
}else {
buffer.append(" or "+attribute[j]+" like '%"+strs[i]+"%'");
}
}
buffer.append(")");
}
if(buffer.length()>0) {
hql+=buffer.toString();
}
}
String totalhq="select count(*) "+hql;
long total=(Long) getSession().createQuery(totalhq).uniqueResult();//查询总条数
Query query= getSession().createQuery("select person "+hql);
List list=query.setFirstResult((page-1)*rows.intValue()).setMaxResults(rows.intValue()).list(); //分页查找
pageData.setTotal(total);
pageData.setRows(list);