Hibernate似乎使用Oracle中的Criterion API错误地处理日期范围。 SQL Query本身似乎是正确的(从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
的{{1}}会返回大于 10x 的List<Foo>
个对象。对应的SQL查询呢。所有额外的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;
}
答案 0 :(得分:0)
尝试重写查询
List<Bar> bars = sessionFactory.getCurrentSession()
.createCriteria(Bar.class)
.add(Restrictions.ge("timestamp", start))
.add(Restrictions.le("timestamp", end))
.list();
它和你一样,但是我从来没有见过类似你使用类变量的例子。
您也应该HQL(hibernate) timestamp range match此Restrictions Between for Date in Hibernate Criteria
检查此链接编辑2: 请查看此处的示例:http://www.javalobby.org/articles/hibernatequery102/
答案 1 :(得分:0)
我现在不记得或查看这背后的理由,但你所看到的可能是预期的行为。试试这个:
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);