注:實際業務中可能比較複雜不得不用原生sql執行時可能會遇到該問題,爲了描述問題,本例採用簡單的舉例
表1:
tbtask:
具有如下列:taskId,name,groupId
表2:
tbtaskGroup:
具有如下列:tbgroupId,name
使用原生sql表連接獲取task表和group表的name信息
select task.name,group.name from tbtask task left join tbtaskGroup group on task.groupId=group.tbgroupId
至此闡述問題:
這個sql語句如果直接在mysql客戶端執行的話沒有任何問題,可以正確得到兩個表的name值,但是如果使用hibernate執行原生sql的話會導致得到的結果並不是我們想要的結果,相同列直接發生了值得覆蓋現象,甚至導致賦值錯亂。
網上也有類似的問題,可能是我的方式不正確均未得到正確的解決辦法,根據經驗終於試驗出了幾種解決辦法,現總結如下:
錯誤的方式1:直接命名別名
eq:String sql = select task.name taskName,group.name groupName from tbtask task left join tbtaskGroup group on task.groupId=group.tbgroupId
List list = this.getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
List result = session.createSQLQuery(sql).list();
return result;
}
});
return list;
debug發現問題仍然沒解決,後臺報錯:找不到name字段
錯誤的方式2:使用{}
eq:String sql = select {task}.name taskName,{group}.name groupName from tbtask {task}left join tbtaskGroup {group} on {task}.groupId={group}.tbgroupId
仍然報錯
正確解決方式1:
採用子查詢重新給列起名
eq:String sql = select task.name taskName,group.groupName groupName from tbtask task left join (select tbgroupId,name as groupName from tbtaskGroup) group on task.groupId=group.tbgroupId
通過!!!!
正確解決方式2:
查詢兩次 這裏只提供大概思路:首先得到task表的名稱以及groupId 遍歷循環根據groupId查詢group表得到對應的group的name值
正確解決方式3:
給重複的列名給別名。然後通過addScalar()方式(參考:http://blog.sina.com.cn/s/blog_534f69a00101m2pp.html)
Hibernate SQL查詢,相同列名,重複列名的解決方法
StringBuffer hql = new StringBuffer(" select w.id, w.bugTitle, w.projectCode, p.projectName, w.functionModel,"
+ "w.subProductSystem, w.productVersion, w.testEnvironment, w.developPerson,w.testPerson, w.createTime, w.bugState, "
+ "w.preCondition, w.operationStep,w.bugLevel, w.problemPriority, w.actResult, w.expectResult,"
+ " w.apperFrequency,w.bakOther,ee.name as developPersonName,ee2.name as testPersonName,w.reportPerson,ee3.name reportPersonName,"
+ " bh.toPerson,bh.toPersonName,bh.handleState"
+ " from bug_model w left join sys_employee ee on ee.EPid=w.developPerson "
+ " left join sys_employee ee2 on ee2.EPid=w.testPerson "
+ " left join sys_employee ee3 on ee3.EPid=w.reportPerson "
+ " left join project p on w.projectCode=p.projectCode "
+ "left join (select bhh.toPerson,bhh.handleState,bhh.bugModelId,ee4.name toPersonName from bugModelHandle bhh left join sys_employee ee4 on bhh.toPerson=ee4.EPid) bh on w.id=bh.bugModelId "
+ " where 1=1 ");
if(map!=null&&map.get("reportPerson")!=null&&!"".equals(map.get("reportPerson").toString().trim())){
hql.append(" and w.reportPerson=:reportPerson");
}
if(map!=null&&map.get("projectId")!=null&&!"".equals(map.get("projectId").toString().trim())){
hql.append(" and w.projectCode=:projectId");
}
if(map!=null&&map.get("handleState")!=null&&!"".equals(map.get("handleState").toString().trim())&&!"all".equals(map.get("handleState").toString().trim())){
hql.append(" and bh.handleState=:handleState");
}else if(map!=null&&map.get("handleState")!=null&&"".equals(map.get("handleState").toString().trim())){
hql.append(" and bh.handleState is null ");
}else if(map!=null&&map.get("handleState")!=null&&"all".equals(map.get("handleState").toString().trim())){
map.put("handleState", "");
}
Session session = (Session) entityManager.getDelegate();
org.hibernate.Query query = session.createSQLQuery(hql.toString())
.addScalar("id") .addScalar("bugTitle") .addScalar("projectCode").addScalar("projectName") .addScalar("functionModel")
.addScalar("subProductSystem") .addScalar("productVersion") .addScalar("testEnvironment") .addScalar("developPerson")
.addScalar("testPerson") .addScalar("createTime") .addScalar("bugState")
.addScalar("preCondition") .addScalar("operationStep").addScalar("bugLevel") .addScalar("problemPriority")
.addScalar("actResult") .addScalar("expectResult")
.addScalar("apperFrequency").addScalar("bakOther").addScalar("developPersonName")
.addScalar("testPersonName").addScalar("reportPerson").addScalar("reportPersonName")
.addScalar("toPerson").addScalar("toPersonName").addScalar("handleState");
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
Set> sets=map.entrySet();
String key="";
for(Map.Entry entry:sets){
key=entry.getKey()+"";
if(entry.getValue()!=null&&!"".equals(entry.getValue().toString()))
{
query.setParameter(key+"", entry.getValue());
}
}
List res=query.list();
int total = res.size();
query.setFirstResult(pageable.getOffset());
query.setMaxResults(pageable.getPageSize());
return new PageImpl