it-swarm.com.de

Wie führt man eine Limitabfrage in HQL durch?

Gibt es in Hibernate 3 eine Möglichkeit, das Äquivalent des folgenden MySQL-Grenzwerts in HQL auszuführen?

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

Ich möchte setMaxResults möglichst nicht verwenden. Dies war definitiv in der älteren Version von Hibernate/HQL möglich, scheint jedoch verschwunden zu sein.

206
stevedbrown

Dies wurde gepostet im Hibernate-Forum vor ein paar Jahren, als gefragt wurde, warum dies in Hibernate 2, aber nicht in Hibernate 3 funktioniert hat:

Limit war nie eine unterstützte Klausel in HQL. Sie sollen setMaxResults () verwenden.

Wenn es also in Ruhezustand 2 funktioniert hat, scheint dies eher zufällig als beabsichtigt zu sein. Ich denke, das lag daran, dass der Hibernate 2-HQL-Parser die Bits der Abfrage, die er als HQL erkannte, ersetzen und den Rest so lassen würde, wie er war Sie könnten sich in ein natives SQL einschleichen. Hibernate 3 hat jedoch einen richtigen AST HQL-Parser, und es ist viel weniger nachsichtig.

Ich denke, Query.setMaxResults() ist wirklich Ihre einzige Option.

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

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

Wenn Sie setMaxResults() nicht für das Query-Objekt verwenden möchten, können Sie immer wieder zur normalen SQL zurückkehren.

16
pjp

Wenn Sie setMaxResults nicht verwenden möchten, können Sie anstelle von list auch Query.scroll verwenden und die gewünschten Zeilen abrufen. Zum Beispiel für Paging. 

5
Lluis Martinez

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

Dies funktionierte für mich, ohne setmaxResults(); zu verwenden.

Geben Sie einfach den Maximalwert (in diesem Fall 5) an, ohne das Schlüsselwort limit.: P zu verwenden

3
Dilawar

Meine Beobachtung ist, dass selbst wenn Sie im HQL (Hibernate 3.x) ein Limit haben, dies entweder einen Parsing-Fehler verursacht oder einfach ignoriert wird. (Wenn Sie vor dem Limit eine Reihenfolge von + desc/asc haben, wird diese ignoriert. Wenn Sie vor dem limit nicht asc/asc haben, wird ein Parsing-Fehler verursacht.)

1
Xingsheng

Kann in diesem Modus ein Limit verwalten

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

Dies ist ein wirklich einfacher Code, um ein Limit oder eine Liste zu behandeln. 

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

Sie müssen eine native Abfrage schreiben, siehe 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

Sie können dafür leicht die Paginierung verwenden.

    @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value = "true") })
    @Query("select * from a_table order by a_table_column desc")
    List<String> getStringValue(Pageable pageable);

sie müssen new PageRequest(0, 1) übergeben, um Datensätze abzurufen, und aus der Liste den ersten Datensatz abrufen.

0
tk_