Исключение Java Classcast, которое включает в себя списоквернулся в спящий - PullRequest
1 голос
/ 18 июля 2011

Прежде всего, я поддерживаю некоторый код, который не написал, и я довольно плохо знаком с Java и Hibernate. Недавно я настроил запрос, который выполняется в сеансе Hibernate. Тип возврата не изменился (он остается списком), но я изменил запрос с session.createquery на session.createSQLquery. По какой-то причине это сломало код, который использует возвращаемый список.

Вот метод потребления:

public void getStuff(CompanyDAO company, ProductDAO dao, Long listingId, Long year, Long prodId, String startTag, String endAdFileTag, String letter) throws DAOException {
        List<Object[]> Products = dao.loadStuff(year, prodId, listingId, letter);

        if (Products != null && Products.size() > 0) {
            for (Object[] p : Products) {
                if (p != null) {
                    ProductListing parentChild = (ProductListing) p[0];
                    Long childCountObj = (Long) p[1];
                    int childCount = childCountObj.intValue();

                    if (parentChild != null) {
                        parentChild.setNextLevelChildrenCount(childCount);
                     }
                }
            }
        }
    } 

Это расширенный цикл for (for (Object [] p: Products) {), вызывающий исключение.

Вот исключение: java.lang.ClassCastException: ProductListing нельзя привести к [Ljava.lang.Object;

Я не понимаю, почему изменение запроса может нарушить этот код. Запрос возвращает массив объектов так же, как до настройки.

Буду признателен за понимание этой загадки.

Спасибо.

DAO до:
public List loadStuff (Длинный год, Длинный prodId, Длинный listId, Строковое письмо) выдает DAOException { Session session = HibernateUtil.getSession (HibernateUtil.keys [sessionId]); StringBuffer strQuery = new StringBuffer (); if (year == null || prodId == null || listId == null) возвращает ноль;

    logger.debug("prodCode = " + prodId);
    logger.debug("year = " + year);


    strQuery.append("select pl, (select count(*) from ProductListing pppl where pppl.listingId = :listingid ");
    strQuery.append(" and pppl.responseYear = :year and pppl.parentProductId = pl.productId) as CHILD_COUNT ");
    strQuery.append(" from ProductListing pl ");
    strQuery.append(" where pl.parentProductId = :prodid ");
    strQuery.append(" and pl.responseYear = :year ");
    strQuery.append(" and pl.listingId = :listingid ");

    strQuery.append(" and (exists(select 0 from ProductListingMain plm, PdMain pm ");
    strQuery.append(" where plm.productListingId = pl.id ");
    strQuery.append(" and pm.currentVersionId = plm.versionId ");
    strQuery.append(" and pm.responded = 'Y' ");
    strQuery.append(" and pm.deleteFlag = 'N' ");
    strQuery.append(" and pm.onlineFlag = 'Y') ");
    strQuery.append(" or exists(select 0 from ProductListing ppl ");
    strQuery.append(" where ppl.listingId = :listingid ");
    strQuery.append(" and ppl.responseYear = :year ");
    strQuery.append(" and ppl.parentProductId = pl.productId)) ");

    //todo iclude the param letter in the query ... please test it before implementing
    if (letter != null) strQuery.append(" and upper (pl.onlineDescription) like '" + letter + "%' ");

    Query query = session.createQuery(strQuery.toString())
            .setLong("year", year)
            .setLong("prodid", prodId)
            .setLong("listingid", listingId);

    List list = query.list();
    return list;
}  
DAO after:  

public List loadStuff (длинный год, длинный prodId, длинный перечисление ID, строковое письмо) выдает DAOException { Session session = HibernateUtil.getSession (HibernateUtil.keys [sessionId]); StringBuffer strQuery = new StringBuffer (); if (year == null || prodId == null || listId == null) вернуть null;

   String letterClause;
   if (letter != null) 
      letterClause = " and upper (pl.onlineDescription) like '" + letter + "%'  \n";
   else
      letterClause = " ";

   strQuery.append(
   " select pl.* \n" + 
   " from PRODUCT_LINE p, PRODUCT_LINE_X_LISTING pll, \n" + 
   "  PRODUCT_X_LISTING pl, CURRENT_YEAR cy, \n" + 
   "  LISTING l \n" + 
   " where p.id = pll.PRODUCT_LINE_ID \n" + 
   "  and p.prod_line_no = cy.PROD_LINE_MASTER  \n" +
   "  and pl.RESPONSE_YEAR = cy.ONLINE_YEAR \n" + 
   "  and pl.LISTING_ID = cy.LISTING_ID \n" + 
   "  and pll.LISTING_ID = l.id \n" + 
   "  and cy.LISTING_ID = l.id \n" + 
   "  and pll.YEAR = cy.ONLINE_YEAR \n" + 
   "  and p.Id = pll.product_line_id \n" + 
   "  and pl.PARENT_PRODUCT_ID = " + prodId + 
   "  and pl.LISTING_ID = " + listingId +
   "  and exists \n" +
           "   (select 'x' \n" + 
           "   from pd_product_listing_mv mv \n" +
           "   where mv.listing_id = pl.listing_id \n" +
           "     and mv.id = pl.id) \n" +
     letterClause +
   " order by upper(pl.ONLINE_DESCRIPTION) ");

    Query query = session.createSQLQuery(strQuery.toString())
     // return all columns in the ProductListing table, i.e. the entire class
       .addEntity("pl", com.acme.run.model.directories.ProductListing.class);
    List list = query.list();

    return list;
}

Извините, это не отформатировано лучше. Это мой первый пост и

Ответы [ 2 ]

2 голосов
/ 18 июля 2011

Вы выбираете только pl.* и используете addEntity("pl", ProductListing.class), поэтому возвращаемый список имеет объекты типа ProductListing. Старый запрос тоже выбирал CHILD_COUNT, но не больше. Я полагаю, вы забыли значение COUNT в новом запросе.

0 голосов
/ 18 июля 2011

Похоже, что изменение вашего запроса с "createquery" на createqlquery "привело к тому, что Hiberate вернул вам список объектов ProductListing вместо List

Трудно сказать, не глядя на ProductDAO - старый и новыйверсии.

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