【问题标题】:Hibernate Date Criteria fails but HQL works休眠日期标准失败,但 HQL 工作
【发布时间】:2012-01-18 16:28:10
【问题描述】:

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. 但在 标准 的情况下,BarList&lt;Foo&gt; 返回的 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;
}

【问题讨论】:

  • 能发一下酒吧课吗?
  • @Floradu88,korifey,Bar 已发布。
  • @JohanSjöberg this question and the first answer to it 有帮助吗?
  • @Kohányi, ty 但问题不在于包容性/排他性搜索,而在于休眠返回的Foos 比数据库中存在的更多。
  • 请发布工作查询带来的所有对象 foo

标签: java oracle hibernate date restrictions


【解决方案1】:

我现在不记得或查找这背后的基本原理,但您看到的可能是预期的行为。试试这个:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

【讨论】:

    【解决方案2】:

    尝试重写查询

    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/

    【讨论】:

    • 感谢您的回答。这没什么区别。范围查询似乎有效,但休眠组装结果却没有。
    • ty,虽然我已经得到了正确的 number 个结果
    • 然后发布解决方案:p 请
    • 也许我的错误描述不充分。但问题是我得到了许多Foo 对象。如果我应该得到 1 个 Foo 回来,我最终会得到 ~10 个 Foo 副本(但仅使用 Criteria API)。
    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 2011-01-29
    • 1970-01-01
    • 2017-09-07
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多