hibernate使用原生sql查詢Hibernate原生SQL多表查詢字段名重複問題以及解決方法

注:實際業務中可能比較複雜不得不用原生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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章