webentwicklung-frage-antwort-db.com.de

Holen Sie sich einen Datensatz mit der maximalen ID unter Verwendung der Ruhezustand-Kriterien

Mit Hibernate 's Criteria API möchte ich den Datensatz innerhalb einer Tabelle mit dem maximalen Wert für eine bestimmte Spalte auswählen.

Ich habe versucht, Projections , zu verwenden, um einen Alias ​​zu erstellen für max(colunName), dann in restrictions.eq() , aber es sagt mir immer "invalid number".

Wie kann ich das mit Hibernate richtig machen?

29
Amr Faisal

Sie können eine DetachedCriteria verwenden, um eine Unterabfrage auszudrücken.

DetachedCriteria maxId = DetachedCriteria.forClass(Foo.class)
    .setProjection( Projections.max("id") );
session.createCriteria(Foo.class)
    .add( Property.forName("id").eq(maxId) )
    .list();

Verweise

36
Pascal Thivent

Ich habe festgestellt, dass die Verwendung von addOrder und setMaxResults für mich funktioniert hat.

Criteria c = session.createCriteria(Thingy.class);
c.addOrder(Order.desc("id"));
c.setMaxResults(1);
return (Thingy)c.uniqueResult();

Wenn Sie den MySQL-Dialekt verwenden, generiert dies eine vorbereitete SQL-Anweisung in etwa wie folgt (einige Felder werden entfernt):

select this_.id ... from Thingy this_ order by this_.id desc limit ?

Ich bin nicht sicher, ob diese Lösung für andere Dialekte als MySQL geeignet ist.

22
amacleod

Benutzen

addOrder(Order.desc("id"))

und hol nur das erste ergebnis :)

6
WhyNotHugo

HQL:

from Person where person.id = (select max(id) from Person)

Ungetestet. Ihre Datenbank muss Subselects in der where-Klausel verstehen.

Zu faul, um herauszufinden, ob und wie eine solche Auswahl mit den Kriterien api ausgedrückt werden kann. Natürlich können Sie zwei Abfragen durchführen: Rufen Sie zuerst die maximale ID und dann die Entität mit dieser ID auf.

1
meriton

Die Reinigungslösung wäre auch:

DetachedCriteria criteria = DetachedCriteria.forClass(Foo.class).setProjection(Projections.max("id"));
Foo fooObj =(Foo) criteria.getExecutableCriteria(getCurrentSession()).list().get(0);
0
code chimp
    Date maxDateFromDB = null;
    Session session = (Session) entityManager.getDelegate();
//Register is and Entity and assume maxDateFromDB is a column.
//Status is another entity with Enum Applied.
//Code is the Parameter for One to One Relation between Register and Profile entity.
    Criteria criteria = session.createCriteria(Register.class).setProjection(Projections.max("maxDateFromDB") )
    .add(Restrictions.eq("status.id", Status.Name.APPLIED.instance().getId()));
    if(code != null && code > 0) {
        criteria.add(Restrictions.eq("profile.id", code));
    }
    List<Date> list = criteria.list();

    if(!CollectionUtils.isEmpty(list)){
        maxDateFromDB = list.get(0);
    }
0
Kumar Abhishek

Um es komplett mit Detached Criteria zu tun (weil ich die Detached-Kriterien gerne ohne Sitzung konstruieren möchte)

DetachedCriteria maxQuery = DetachedCriteria.forClass(Foo.class)
    .setProjection( Projections.max("id") );
DetachedCriteria recordQuery = DetachedCriteria.forClass(Foo.class)
    .add(Property.forName("id").eq(maxId) );
0
Daniel Patrick