[英]Hibernate Date Criteria fails but HQL works
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
结果数相同(且正确)
但是在标准情况下,带有List<Foo>
的Bar
返回的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;
}
尝试重写查询
List<Bar> bars = sessionFactory.getCurrentSession()
.createCriteria(Bar.class)
.add(Restrictions.ge("timestamp", start))
.add(Restrictions.le("timestamp", end))
.list();
就像您所做的一样,但我从未见过像您一样使用类类型变量的示例。
您还应该检查此链接, HQL(休眠)时间戳范围也与此休眠条件中的“日期之间的限制”相 匹配
编辑2:在此处检查示例: http : //www.javalobby.org/articles/hibernatequery102/
我现在不记得或没有找到背后的理由,但是您看到的可能是预期的行为。 尝试这个:
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.