Beispiele für Hibernate-Kriterien

Beispiele für Ruhezustandskriterien

Die Hibernate Criteria API ist eine objektorientiertere und elegantere Alternative zur Hibernate Query Language (HQL). Es ist immer eine gute Lösung für eine Anwendung mit vielen optionalen Suchkriterien.

Beispiel in HQL und Kriterien

Hier ist eine Fallstudie zum Abrufen einer Liste vonStockDailyRecord mit optionalen Suchkriterien - Startdatum, Enddatum und Volumen, Reihenfolge nach Datum.

1. HQL-Beispiel

In HQL müssen Sie vergleichen, ob dies das erste Kriterium ist, an das die Wo-Syntax angehängt wird, und das Datum in ein geeignetes Format formatieren. Es funktioniert, aber die langen Codes sind hässlich, umständlich und fehleranfällig. Die Verkettung von Zeichenfolgen kann Sicherheitsbedenken hervorrufen, z. B. SQL-Injection.

public static List getStockDailtRecord(Date startDate,Date endDate,
   Long volume,Session session){

   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
   boolean isFirst = true;

   StringBuilder query = new StringBuilder("from StockDailyRecord ");

   if(startDate!=null){
    if(isFirst){
        query.append(" where date >= '" + sdf.format(startDate) + "'");
    }else{
        query.append(" and date >= '" + sdf.format(startDate) + "'");
    }
    isFirst = false;
   }

   if(endDate!=null){
    if(isFirst){
        query.append(" where date <= '" + sdf.format(endDate) + "'");
    }else{
        query.append(" and date <= '" + sdf.format(endDate) + "'");
    }
    isFirst = false;
   }

   if(volume!=null){
    if(isFirst){
        query.append(" where volume >= " + volume);
    }else{
        query.append(" and volume >= " + volume);
    }
    isFirst = false;
   }

   query.append(" order by date");
   Query result = session.createQuery(query.toString());

   return result.list();
}

2. Beispiel für Kriterien

In "Kriterien" müssen Sie weder vergleichen, ob dies das erste Kriterium ist, an das die Wo-Syntax angehängt wird, noch das Datum formatieren. Die Codezeile wird reduziert und alles wird eleganter und objektorientierter gehandhabt.

   public static List getStockDailyRecordCriteria(Date startDate,Date endDate,
        Long volume,Session session){

    Criteria criteria = session.createCriteria(StockDailyRecord.class);
    if(startDate!=null){
        criteria.add(Expression.ge("date",startDate));
    }
    if(endDate!=null){
        criteria.add(Expression.le("date",endDate));
    }
    if(volume!=null){
        criteria.add(Expression.ge("volume",volume));
    }
    criteria.addOrder(Order.asc("date"));

    return criteria.list();
  }

Kriterien-API

Lassen Sie sich durch einige beliebte Funktionen der Kriterien-API führen.

1. Kriterien Basisabfrage

Erstellen Sie ein Kriterienobjekt und rufen Sie alle ‘StockDailyRecord’ -Datensätze aus der Datenbank ab.

Criteria criteria = session.createCriteria(StockDailyRecord.class);

2. Abfrage der Kriterienreihenfolge

Das Ergebnis wird in aufsteigender Reihenfolge nach "Datum" sortiert.

Criteria criteria = session.createCriteria(StockDailyRecord.class)
    .addOrder( Order.asc("date") );

Das Ergebnis wird in absteigender Reihenfolge nach "Datum" sortiert.

Criteria criteria = session.createCriteria(StockDailyRecord.class)
    .addOrder( Order.desc("date") );

3. Abfrage der Kriterieneinschränkungen

Die Restrictions-Klasse bietet viele Methoden für die Vergleichsoperation.

Restrictions.eq

Stellen Sie sicher, dass der Wert 10000 entspricht.

Criteria criteria = session.createCriteria(StockDailyRecord.class)
    .add(Restrictions.eq("volume", 10000));
Restrictions.lt, le, gt, ge

Stellen Sie sicher, dass die Lautstärke unter 10000 liegt.

Criteria criteria = session.createCriteria(StockDailyRecord.class)
   .add(Restrictions.lt("volume", 10000));

Stellen Sie sicher, dass die Lautstärke 10000 oder weniger beträgt.

Criteria criteria = session.createCriteria(StockDailyRecord.class)
   .add(Restrictions.le("volume", 10000));

Stellen Sie sicher, dass die Lautstärke über 10000 liegt.

Criteria criteria = session.createCriteria(StockDailyRecord.class)
   .add(Restrictions.gt("volume", 10000));

Stellen Sie sicher, dass die Lautstärke 10000 oder mehr beträgt.

Criteria criteria = session.createCriteria(StockDailyRecord.class)
   .add(Restrictions.ge("volume", 10000));
Restrictions.like

Vergewissern Sie sich, dass der Aktienname mit "MKYONG" beginnt, gefolgt von beliebigen Zeichen.

Criteria criteria = session.createCriteria(StockDailyRecord.class)
   .add(Restrictions.like("stockName", "MKYONG%"));
Restrictions.between

Stellen Sie sicher, dass das Datum zwischen dem Startdatum und dem Enddatum liegt.

Criteria criteria = session.createCriteria(StockDailyRecord.class)
   .add(Restrictions.between("date", startDate, endDate));
Restrictions.isNull, isNotNull

Stellen Sie sicher, dass das Volume null ist.

Criteria criteria = session.createCriteria(StockDailyRecord.class)
   .add(Restrictions.isNull("volume"));

Stellen Sie sicher, dass das Volume nicht null ist.

Criteria criteria = session.createCriteria(StockDailyRecord.class)
   .add(Restrictions.isNotNull("volume"));

Viele andere Restrictions-Funktionen finden Sie hier.
https://www.hibernate.org/hib_docs/v3/api/org/hibernate/criterion/Restrictions.html

3. Kriterien, nach denen das Ergebnis angezeigt wird

Kriterien bieten nur wenige Funktionen, um die Paginierung extrem einfach zu gestalten. Beginnen Sie mit dem 20. Datensatz und rufen Sie die nächsten 10 Datensätze aus der Datenbank ab.

Criteria criteria = session.createCriteria(StockDailyRecord.class);
criteria.setMaxResults(10);
criteria.setFirstResult(20);

Warum nicht Kriterien!

Die Kriterien-API bringt einige Nachteile mit sich.

1. Leistungsproblem

Sie haben keine Möglichkeit, die von Hibernate generierte SQL-Abfrage zu steuern. Wenn die generierte Abfrage langsam ist, können Sie die Abfrage nur schwer optimieren, und Ihr Datenbankadministrator mag sie möglicherweise nicht.

1. Wartungsproblem

Alle SQL-Abfragen sind über den Java-Code verteilt. Wenn eine Abfrage fehlgeschlagen ist, verbringen Sie möglicherweise Zeit damit, die problematische Abfrage in Ihrer Anwendung zu finden. Andererseits sind benannte Abfragen, die in den Hibernate-Zuordnungsdateien gespeichert sind, viel einfacher zu verwalten.

Fazit

Nichts ist perfekt, denken Sie über Ihre Projektanforderungen nach und setzen Sie es mit Bedacht ein.