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();
Наблюдение за ошибками:
Количество Bar
возвращаемых результатов:то же самое (и правильное)
, но в случаях случаях 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;
}