Hibernate 3では、HQLで次のMySQLの制限と同等のことをする方法はありますか?
select * from a_table order by a_table_column desc limit 0, 20;
可能であればsetMaxResultsを使用したくありません。これはHibernate/HQLの古いバージョンでは間違いなく可能でしたが、消えたようです。
これは投稿された 何故Hibernate 2ではうまくいったのにHibernate 3ではうまくいかなかったのかについて尋ねられた数年前のHibernateフォーラムで:
制限はnever HQLでサポートされている句です。あなたはsetMaxResults()を使うことを意図しています。
それで、それがHibernate 2でうまくいったとしたら、それは意図的なものではなく偶然によるもののようです。 I thinkこれはHibernate 2 HQLパーサーがHQLとして認識したクエリの一部を置き換え、それ以外はそのままにしておくため、ネイティブSQLにこっそり入ることができたためです。 Hibernate 3は、しかし、適切なAST HQLパーサーを持っています、そしてそれはずっと寛容ではありません。
Query.setMaxResults()
は本当にあなたの唯一の選択肢だと思います。
// SQL: SELECT * FROM table LIMIT start, maxRows;
Query q = session.createQuery("FROM table");
q.setFirstResult(start);
q.setMaxResults(maxRows);
Query
オブジェクトでsetMaxResults()
を使用したくない場合は、通常のSQLの使用にいつでも戻すことができます。
SetMaxResultsを使用したくない場合は、listの代わりにQuery.scrollを使用して、必要な行を取得することもできます。たとえばページングに便利です。
String hql = "select userName from AccountInfo order by points desc 5";
これは私にとってsetmaxResults();
を使わなくてもうまくいきました
キーワードlimit
を使用せずに、最後の最大値(この場合は5)を指定してください。 :P
私の見解では、たとえあなたがHQL(hibernate 3.x)に限界があっても、それは構文解析エラーを引き起こすか、単に無視されるかのどちらかでしょう。 (限度前に+ desc/ascで注文した場合は無視され、限度前にdesc/ascがない場合は構文解析エラーが発生します)
このモードで制限を管理できるか
public List<ExampleModel> listExampleModel() {
return listExampleModel(null, null);
}
public List<ExampleModel> listExampleModel(Integer first, Integer count) {
Query tmp = getSession().createQuery("from ExampleModel");
if (first != null)
tmp.setFirstResult(first);
if (count != null)
tmp.setMaxResults(count);
return (List<ExampleModel>)tmp.list();
}
これは制限やリストを処理するための非常に単純なコードです。
@Query(nativeQuery = true,
value = "select from otp u where u.email =:email order by u.dateTime desc limit 1")
public List<otp> findOtp(@Param("email") String email);
Criteria criteria=curdSession.createCriteria(DTOCLASS.class).addOrder(Order.desc("feild_name"));
criteria.setMaxResults(3);
List<DTOCLASS> users = (List<DTOCLASS>) criteria.list();
for (DTOCLASS user : users) {
System.out.println(user.getStart());
}
ネイティブクエリを書く必要があります。 this を参照してください。
@Query(value =
"SELECT * FROM user_metric UM WHERE UM.user_id = :userId AND UM.metric_id = :metricId LIMIT :limit", nativeQuery = true)
List<UserMetricValue> findTopNByUserIdAndMetricId(
@Param("userId") String userId, @Param("metricId") Long metricId,
@Param("limit") int limit);
このためにページネーションを簡単に使用できます。
@QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value = "true") })
@Query("select * from a_table order by a_table_column desc")
List<String> getStringValue(Pageable pageable);
レコードを取得するにはnew PageRequest(0, 1)
を渡す必要があり、リストから最初のレコードを取得します