Как получить самую последнюю запись на основе поля last_modified в спящем JPA (реализация сеанса) - PullRequest
1 голос
/ 14 декабря 2011

Последние 3 часа я почесал голову, чтобы найти самый последний объект с помощью hibernate.Я пытался, но всегда возвращал либо ноль, либо castTypeExcetpion.

public Content getMostRecentByCategoryAndGenre(Category category, Genre genre){
    logger.info("calling getMostRecentByCategoryAndGenre");
    logger.debug(category);
    logger.debug(genre);

    DetachedCriteria recentDate = DetachedCriteria.forClass(this.getPersistentClass());
    recentDate.setProjection(Projections.max("lastModified"));

    Content recent = (Content)  this.getSessionFactory().getCurrentSession().createCriteria(this.getPersistentClass())
            .add(Restrictions.eq("genre", genre))
            .add(Restrictions.eq("category", category))
            .setProjection(Projections.max("lastModified")) // gives cannot cast timestamp to com.bla.bla.bla.myproject

         // .add(Property.forName("lastModified").eq(recentDate)) // this if uncommented and previous line commented gives null result 
            .uniqueResult();
    logger.debug(recent);
    return recent;
}

Есть что-то, что я не делаю правильно? спасибо, что прочитали это.

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

все в одном запросе

// subquery to get the most recent date for this genre and category
DetachedCriteria recentDate = DetachedCriteria.forClass(this.getPersistentClass())
    .add(Restrictions.eq("genre", genre))
    .add(Restrictions.eq("category", category))
    .setProjection(Projections.max("lastModified"));

// get the content for the most recent date, genre and category
Content recent = session.createCriteria(this.getPersistentClass())
        .add(Restrictions.eq("genre", genre))
        .add(Restrictions.eq("category", category))
        .add(Subqueries.eq("lastModified", recentDate))
        .uniqueResult<Content>();
0 голосов
/ 14 декабря 2011

Поскольку вы используете проекцию на поле lastModified, в результате вы получите только значение lastModified в качестве Списка размера 1, содержащее значение lastModified, так как в результате вы получите только одну строку, которую нельзя преобразовать в ваш Content тип класса. Если вам нужен недавний объект Content, просто прекратите добавлять прогноз по критериям.

...