Hibernateは、OracleのCriterionAPIを使用して日付範囲を誤って処理しているようです。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();
失敗の観察は次のとおりです。
返される結果の数は
Bar
同じです(そして正しいです)ただし、基準の場合、
Bar
aは、対応するSQLクエリよりも約10倍多くのオブジェクトをList<Foo>
返します。余分なオブジェクトはすべて同一のコピーです。Foo
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;
}