gpt4 book ai didi

java - Hibernate Date Criteria 失败,但 HQL 有效

转载 作者:行者123 更新时间:2023-12-01 05:34:05 24 4
gpt4 key购买 nike

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<Foo>返回大约10倍 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;
}

最佳答案

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

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

关于java - Hibernate Date Criteria 失败,但 HQL 有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8478369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com