繁体   English   中英

休眠日期条件失败,但HQL有效

[英]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();

失败观察是:

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

  2. 但是在标准情况下,带有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM