2011-12-12 58 views
1

Hibernate似乎错误地使用Oracle中的Criterion API处理日期范围。 SQL查询本身似乎是正确的(从Hibernate复制并手动执行)。所以,休眠日期标准失败,但HQL工作

给出

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(); 

的故障现象是:

  1. 的返回Bar结果的数量是相同的(正确)

  2. 但在标准案件一个Bar与a 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; 
} 
+0

请问您可以发布Bar类。 –

+0

贴吧,表绑定和表 – korifey

+0

@ Floradu88,korifey,'酒吧'发布。 –

回答

0

我不记得或查找背后现在这个权利,但你的理由看到的可能是预期的行为。试试这个:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
0

尝试重写查询

List<Bar> bars = sessionFactory.getCurrentSession() 
.createCriteria(Bar.class) 
.add(Restrictions.ge("timestamp", start)) 
.add(Restrictions.le("timestamp", end)) 
.list(); 

这就像你迪一样d,但我从来没有见过像你使用它们那样的类型变量。

您应该检查这个环节也HQL(hibernate) timestamp range match也是这个Restrictions Between for Date in Hibernate Criteria

编辑2: 检查这里的例子:http://www.javalobby.org/articles/hibernatequery102/

+0

感谢您的回答。它没有什么区别。范围查询似乎正在工作,但休眠组装结果不。 –

+0

尝试第二个链接接受的答案 –

+0

ty,虽然我已经得到正确的* number *的结果已经返回 –