Критерии Hibernate Date не работают, но HQL работает - PullRequest
1 голос
/ 12 декабря 2011

Hibernate, похоже, неправильно обрабатывает диапазоны дат, используя Criterion API в Oracle.Сам SQL-запрос кажется правильным (скопировал его из Hibernate и выполнил вручную).Итак,

дано

Clazz<Bar> clazz;
Date start, end; 

, это терпит неудачу

List<Bar> bars = sessionFactory.getCurrentSession()
    .createCriteria(clazz)
    .add(Restrictions.between("timestamp", start, end))
    .list();

и это

 List<Bar> bars = sessionFactory.getCurrentSession()
     .createCriteria(clazz)
     .add(Restrictions.ge("timestamp", start))
     .add(Restrictions.le("timestamp", end))
     .list();

но это works

List<Bar> bars = sessionFactory.getCurrentSession()
    .createQuery("from Bar b where b.timestamp > ? and b.timestamp < ?")
    .setDate(0, start)
    .setDate(1, end)
    .list();

Наблюдение за ошибками:

  1. Количество Bar возвращаемых результатов:то же самое (и правильное)

  2. , но в случаях случаях Bar с List<Foo> возвращает примерно 10x больше Fooобъекты, чем соответствующий запрос SQL.Все дополнительные Foo объекты являются идентичными копиями.


РЕДАКТИРОВАТЬ

@Entity
public class Bar {

    @Id 
    private String id;

    @Temporal(TemporalType.TIMESTAMP)
    private Date timestamp;

    @ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinTable(
        name = "bar_foo",
        joinColumns = { @JoinColumn(name = "barid") },
        inverseJoinColumns = { @JoinColumn(name = "fooid") }
    )
    private List<Foo> params;
}
@Entity
public class Foo {
    @Id private String id;
}

Ответы [ 2 ]

0 голосов
/ 13 декабря 2011

Я не могу вспомнить или найти объяснение этому прямо сейчас, но то, что вы видите, может быть ожидаемым поведением. Попробуйте это:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
0 голосов
/ 12 декабря 2011

Попробуйте переписать запрос

List<Bar> bars = sessionFactory.getCurrentSession()
 .createCriteria(Bar.class)
 .add(Restrictions.ge("timestamp", start))
 .add(Restrictions.le("timestamp", end))
 .list();

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

Вы должны проверить этоссылка также Соответствие диапазона меток времени HQL (hibernate) также это Ограничения на дату в критериях Hibernate

Редактировать 2: Проверьте примеры здесь: http://www.javalobby.org/articles/hibernatequery102/

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