【发布时间】:2012-01-18 16:28:10
【问题描述】:
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和List<Foo>返回的Foo对象大约比相应的 SQL 查询多 10 倍。所有额外的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;
}
【问题讨论】:
-
能发一下酒吧课吗?
-
@Floradu88,korifey,
Bar已发布。 -
@JohanSjöberg this question and the first answer to it 有帮助吗?
-
@Kohányi, ty 但问题不在于包容性/排他性搜索,而在于休眠返回的
Foos 比数据库中存在的更多。 -
请发布工作查询带来的所有对象 foo
标签: java oracle hibernate date restrictions