web-dev-qa-db-ja.com

HQLでのように制限クエリを行きますか?

Hibernate 3では、HQLで次のMySQLの制限と同等のことをする方法はありますか?

select * from a_table order by a_table_column desc limit 0, 20;

可能であればsetMaxResultsを使用したくありません。これはHibernate/HQLの古いバージョンでは間違いなく可能でしたが、消えたようです。

211
stevedbrown

これは投稿された 何故Hibernate 2ではうまくいったのにHibernate 3ではうまくいかなかったのかについて尋ねられた数年前のHibernateフォーラムで:

制限はnever HQLでサポートされている句です。あなたはsetMaxResults()を使うことを意図しています。

それで、それがHibernate 2でうまくいったとしたら、それは意図的なものではなく偶然によるもののようです。 I thinkこれはHibernate 2 HQLパーサーがHQLとして認識したクエリの一部を置き換え、それ以外はそのままにしておくため、ネイティブSQLにこっそり入ることができたためです。 Hibernate 3は、しかし、適切なAST HQLパーサーを持っています、そしてそれはずっと寛容ではありません。

Query.setMaxResults()は本当にあなたの唯一の選択肢だと思います。

290
skaffman
 // SQL: SELECT * FROM table LIMIT start, maxRows;

Query q = session.createQuery("FROM table");
q.setFirstResult(start);
q.setMaxResults(maxRows);
136
Jessu

QueryオブジェクトでsetMaxResults()を使用したくない場合は、通常のSQLの使用にいつでも戻すことができます。

19
pjp

SetMaxResultsを使用したくない場合は、listの代わりにQuery.scrollを使用して、必要な行を取得することもできます。たとえばページングに便利です。

5
Lluis Martinez

String hql = "select userName from AccountInfo order by points desc 5";

これは私にとってsetmaxResults();を使わなくてもうまくいきました

キーワードlimitを使用せずに、最後の最大値(この場合は5)を指定してください。 :P

3
Dilawar

私の見解では、たとえあなたがHQL(hibernate 3.x)に限界があっても、それは構文解析エラーを引き起こすか、単に無視されるかのどちらかでしょう。 (限度前に+ desc/ascで注文した場合は無視され、限度前にdesc/ascがない場合は構文解析エラーが発生します)

1
Xingsheng

このモードで制限を管理できるか

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();
}

これは制限やリストを処理するための非常に単純なコードです。

1
biancardi
@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);
1
Leena Varshney
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());
            }
0

ネイティブクエリを書く必要があります。 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);
0
swatisinghi

このためにページネーションを簡単に使用できます。

    @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)を渡す必要があり、リストから最初のレコードを取得します

0
tk_