Hibernate 似乎使用 Oracle 中的 Criterion API 错误地处理日期范围。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();
但这有效
List<Bar> bars = sessionFactory.getCurrentSession()
.createQuery("from Bar b where b.timestamp > ? and b.timestamp < ?")
.setDate(0, start)
.setDate(1, end)
.list();
失败观察是:
Bar
返回的结果数相同(且正确)但在标准情况下,
Bar
带有 a 的 aList<Foo>
返回的对象大约是相应 SQL 查询的10 倍。Foo
所有额外的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;
}