hibernate查询sql语句,得出结果和直接查数据库不一样

妞妞超人 发布于 2014/03/07 15:41
阅读 5K+
收藏 0

我有两个表,一个客户表,一个用户表,客户表中有领用人和指派人和用户表外键关联,现在我想多表关联查询出客户的指派人和领用人。

直接在数据库中写sql语句:

select cliName,c.uName,editDate,b.uName
from crm_client o  
left join crm_user b on o.belongUid = b.uId  
left join crm_user c on o.pointUid = c.uId
where 1=1  and o.comId = '4028814a4467fb980144680037aa0001'
order by  o.cliId desc

查询出结果是:

而我用hibernate查询。

public List findColectionByConditionNoPageWithExcelBySql(String condition,
			final Object[] params, Map<String, String> orderby,String selectCondition,String mainTable,String inner) {
		
		String sql = " select "+selectCondition + " from " + mainTable +" o " + inner + " where 1=1 ";
		String orderbyCondition = this.getOrderByCondition(orderby);
		final String finalSql = sql + condition + orderbyCondition;
		
		@SuppressWarnings("unchecked")
		List list = (List)this.getHibernateTemplate().executeFind(new HibernateCallback() {
			
			public Object doInHibernate(Session session)
					throws HibernateException, SQLException {
				Query query = session.createSQLQuery(finalSql);
				if(params!=null && params.length>0){
					for(int i=0;i<params.length;i++){
						query.setParameter(i, params[i]);
					}
				}
				
				return query.list();
			}
		});
		return list;
	}
通过传参,最终拼出的sql语句是:

select cliName,c.uName,editDate,b.uName from crm_client o  left join crm_user b on o.belongUid = b.uId  left join crm_user c on o.pointUid = c.uId where 1=1  and o.comId = ? order by  o.cliId desc

结果查询出来的c.uName和b.uName一样,即前面的指派人将后面的领用人指派,指派人为空,领用人也为空,

而真正的结果应该是这样

不知道为什么会这样。控制台打印出的sql语句,去数据库直接查询也是正确结果,可是运行出的结果就是前面那样。

加载中
0
妞妞超人

解决了,用hql执行语句

select o.cliName,b.userName,c.userName from CrmClient o

left join o.belongUser b

left join o.pointUser c

where o.company.comId = ?

hql查询和left join 没有on,关联主表对象的外键对象既可。

0
backtract
backtract
把你的HQL语句在HQL查询分析器中查询看看结果跟你用sql查询的结果一致吗?
backtract
backtract
回复 @妞妞超人 : 是的 打开myeclipse database explorer 视图 在里面新建数据库连接 然后就可以执行hql查询了
妞妞超人
hql查询分析器怎么查看,是在MyEclipse中吗?
0
妞妞超人
用一楼的方法,在hql查询分析器中检查了下,得到了想要的结果
0
开源中国首席公关
开源中国首席公关

Hibernate框架的问题,对于相同字段名的结果集,两者数据相同,且靠后的结果等于靠前的结果。

解决方式:给相同字段名添加别名

返回顶部
顶部