Hibernate Date Criteria失败但HQL工作

时间:2011-12-12 17:35:36

标签: java oracle hibernate date restrictions

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

失败观察是:

  1. 返回的Bar个结果数相同(且正确)

  2. 但在标准的情况下,带有Bar的{​​{1}}会返回大于 10x List<Foo>个对象。对应的SQL查询呢。所有额外的Foo个对象都是相同的副本。


  3. 编辑

    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;
    }
    

2 个答案:

答案 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 matchRestrictions Between for Date in Hibernate Criteria

检查此链接

编辑2: 请查看此处的示例:http://www.javalobby.org/articles/hibernatequery102/

答案 1 :(得分:0)

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

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);