Результаты Hibernate и Mysql не совпадают - PullRequest
0 голосов
/ 21 октября 2011

Я использую Hibernate для подключения к mysql в качестве слоя базы данных, странно то, что наборы результатов, выполняемые из Java-кода Hibernate api, отличаются от тех, которые выполняются непосредственно из mysql.Они не являются частью друг друга, они просто выглядят как не имеющие отношения.

Вот код Java на уровне Dao:

    int totalPage = 0;
    int reminder = total % pagination.getPageSize();
    if(total == 0){
        totalPage = 1;
        pagination.setTotalPage(totalPage);
    }else{
        totalPage = reminder == 0 ? total / pagination.getPageSize() : (total - reminder) / pagination.getPageSize() + 1;
        pagination.setTotalPage(totalPage);
    }

    pagination.setTotalRows(total);
    pagination.setBeginAndEndPage(total);

    final StringBuilder queryString = new StringBuilder();
    queryString.append(" select a.target_id as itemId, a.isFree as isFree, ");
    queryString.append(" ni.fullName as item, nc.fullName as category, a.downloadCount as downloadCounts from( ");
    queryString.append(" select dldc.current_category_id, dldc.target_id, dldc.isFree, ");
    queryString.append(" sum(dldc.counts) as downloadCount from download_log_day_count dldc ");
    queryString.append(" group by dldc.current_category_id, dldc.target_id) as a ");
    queryString.append(" left join item i on a.target_id = i.objectId ");
    queryString.append(" left join name ni on i.nameId = ni.objectId ");
    queryString.append(" left join category c on a.current_category_id = c.objectId ");
    queryString.append(" left join name nc on c.nameId = nc.objectId ");
    queryString.append(" order by downloadCounts desc");

    List<ItemReportVO> reportList = (List<ItemReportVO>)getJpaTemplate().execute(new JpaCallback(){

        @Override
        public Object doInJpa(EntityManager em)
                throws PersistenceException {
            SQLQuery query = ((Session)em.getDelegate()).createSQLQuery(queryString.toString());
            query.addScalar("itemId", Hibernate.LONG);
            query.addScalar("isFree", Hibernate.BOOLEAN);
            query.addScalar("item", Hibernate.STRING);
            query.addScalar("category", Hibernate.STRING);
            query.addScalar("downloadCounts", Hibernate.LONG);
            query.setResultTransformer(Transformers.aliasToBean(ItemReportVO.class));
            int firstResult = (pagination.getCurrentPage()-1) * pagination.getPageSize();
            query.setFirstResult(firstResult);
            if(token != null && "all".equals(token)){
                int maxResult = pagination.getPageSize();
                query.setMaxResults( maxResult );
            }else{
                int maxResult = pagination.getPageSize() > Integer.valueOf(token) ? Integer.valueOf(token) : pagination.getPageSize();
                query.setMaxResults( maxResult );
            }
            return query.list();
        }
    });

Когда я устанавливаю show_sql = true в конфигурационном файле Hibernate,Hibernate печатает SQL-запрос ниже, когда код Java запускает «return query.list ();»:

    select a.target_id as itemId, a.isFree as isFree,  ni.fullName as item, nc.fullName as category, a.downloadCount as downloadCounts 
from(  
    select dldc.current_category_id, dldc.target_id, dldc.isFree,  sum(dldc.counts) as downloadCount 
    from download_log_day_count dldc  
    group by dldc.current_category_id, dldc.target_id) as a  
left join item i on a.target_id = i.objectId  
left join name ni on i.nameId = ni.objectId  
left join category c on a.current_category_id = c.objectId  
left join name nc on c.nameId = nc.objectId 
order by downloadCounts desc 
limit ?

Я всегда считаю, что они должны быть одинаковыми, но кажется, что это не так, любой может помочь мненастроить коды java?

1 Ответ

1 голос
/ 21 октября 2011

Hibernate изменит ваш запрос, чтобы применить лимит, который вы закодировали через API setMaxResults(). Также следует добавить rownum> для setFirstResult(), но в вашем случае это может быть самый первый запрос.

Вам не нужно ничего менять, поскольку Hibernate применяет их в базе данных правильным и корректным способом.

Есть ли еще какие-то отличия, которые вас касаются?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...