我现在有两个表:表1字段:code、name
表2字段:code、name执行SQL语句:select t1.code,t1.name,t2.name from 表1 as t1,表2 as t2 where t1.code=t2.code用Hibernate执行SQL进行多表查询功能,结果得出来的数据集中t2.name和t1.name的值是一样的,数据不正确,应该要怎样处理????数据库是MySQL也就是Hibernate执行原生态SQL语句有字段重复时,结果集数据不正确的问题!!!!!!

解决方案 »

  1.   

    creatSqlQuery(select * from t1).addEntity("t1",类.class)试试吧
      

  2.   

    那如果我没有写类呢,我只需要返回一个List的结果集!
      

  3.   

    creatSqlQuery(select * from t1).addEntity("t1",类.class).list()啊
    addEntity只是吧你前面的表关联上你映射的类啊。
    addEntity("t1",类.class)的返回值依然是个query,没有任何改变
      

  4.   

    使用addEntity就是为了区分出你的2个表,避免表的column名称重复的问题
      

  5.   

    问题是如果用addEntity绑定class你不觉得很受限制吗????
    如果我一个项目中有很多SQL语句是需要多表查询,那是不是每个SQL查询语句都对应一个class类呢???如果我一个项目中有几十个不同的SQL查询语句,是不是还要相应的定义几十个对应SQL语句的class类呢?
      

  6.   

    addEntity的目的只是区分数据库字段重名的表映射的类。你关联几十个表,这几十个表字段都重名?
    如果这样的话,你又嫌addEntity麻烦,你就去改数据库列的名字吧,或者用jdbc吧
      

  7.   

    你 可以将你的字段名称命名为别名啊 之后 query 。。 .list 返回是一个List<Map> 之后怎么处理 就是你的事了
      

  8.   

    语句没感觉有问题啊,
    不过写清楚点试试
    select t1.code code1,t1.name name1,t2.name name2 from 表1 as t1,表2 as t2 where t1.code=t2.code
      

  9.   

    select t1.code code1,t1.name name1,t2.name name2 from
    表1 as t1 left join 表2 as t2 on t1.code=t2.code
      

  10.   

    多谢各位的回复!SQL是完全没问题的,直接通过MySQL命令行执行SQL语句返回的结果是对的,经过了Hibernate后,返回结果有同字段名的值就相同!
      

  11.   

    public List findXXX(final Pager pager,final Timestamp starttime,final Timestamp endtime,final String state,final Integer buystate,final String modelcode) {
            List list = null;
            list = super.getHibernateTemplate().execute(new HibernateCallback<List>() {
                @Override
                public List doInHibernate(Session session) throws HibernateException, SQLException {
                    //String sql = "select d.buynum*d.printnum as pnum,d.buynum,d.printnum,t.* from wp_ordertemplate t,(select * from wp_orderdetail where state='0') d,(select guid from wp_order where fast=0) r where  t.guid=d.templateid and d.orderid=r.guid and t.modelcode='1'  ;";
                    StringBuilder strSql = new StringBuilder();
                    strSql.append("select d.buynum*d.printnum as pnum,d.buynum,d.printnum,d.state,d.buynote,d.pdfurl,t.*,r.buystate,t.guid,t.modelid from wp_ordertemplate t,(select * from wp_orderdetail");
                    //此处添加过滤条件
                    ArrayList params = new ArrayList();
                    if(StringUtil.isNotEmpty(state)){
                        strSql.append(" where state = '"+state+"'");
                    }
                    strSql.append(") d,(select * from wp_order where 1=1 ");
                    if(starttime != null && endtime != null){
                        strSql.append(" and inputtime > '"+starttime+"' and inputtime < '"+endtime+"'");
                    }
                    if(buystate != -1){
                        strSql.append(" and buystate = "+buystate);
                    }
                    strSql.append(") r where  t.guid=d.templateid and d.orderid=r.guid");
                    if(buystate!=-1){
                        strSql.append(" and r.buystate = "+buystate);
                    }
                    if(StringUtil.isNotEmpty(modelcode)){
                        strSql.append(" and t.modelcode='"+modelcode+"'");
                    }
                    Long totalCount  = count(strSql.toString());
                    if(totalCount < 0){
                        pager.setRowCount(0);
                        return new ArrayList();
                    }
                    pager.setRowCount(totalCount.intValue());
                    Query query = session.createSQLQuery(strSql.toString())
                                                             .addScalar("pnum")
                                                             .addScalar("buynum")
                                                             .addScalar("printnum")
                                                             .addScalar("state")
                                                             .addScalar("buynote")
                                                             .addScalar("inputtime")
                                                             .addScalar("name")
                                                             .addScalar("imgurl")
                                                             .addScalar("price")
                                                             .addScalar("buystate")
                                                             .addScalar("guid")
                                                             .addScalar("modelid");
                    query.setFirstResult(pager.getBeginRow());
                    query.setMaxResults(pager.getEndRow());
                    return query.list();
                }
            });        return list;
        }    //根据sql查询总记录数
        public  long count(final String strSql){
            long count = 0;
            count = super.getHibernateTemplate().execute(new HibernateCallback<Long>() {
                @Override
                public Long doInHibernate(Session session) throws HibernateException, SQLException {
                    long count = 0;
                    Query query = session.createSQLQuery(strSql);
                    count = query.list().size();
                    return count;
                }
            });
            return count;
        }自己要写一个新的类来封装查询出来的数据。
      

  12.   

    hibernate对复杂的查询很难操作,不过像你上面的那个还是有很多的解决方法的
      

  13.   

    你可以试着把其中一个表的字段做一下相近的类型转换试试  如:表2字段:code、name CAST(t.name AS CHAR(100))