Exemples de critères Hibernate

Exemples de critères d'hibernation

L'API Hibernate Criteria est une alternative plus orientée objet et élégante à Hibernate Query Language (HQL). C'est toujours une bonne solution pour une application qui possède de nombreux critères de recherche facultatifs.

Exemple dans HQL et critères

Voici une étude de cas pour récupérer une liste deStockDailyRecord, avec des critères de recherche facultatifs - date de début, date de fin et volume, ordre par date.

1. Exemple HQL

Dans HQL, vous devez comparer s'il s'agit du premier critère pour ajouter la syntaxe «où» et formater la date dans un format approprié. Cela fonctionne, mais les codes longs sont laids, encombrants et la concaténation de chaînes sujettes aux erreurs peut poser des problèmes de sécurité comme l'injection SQL.

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. Exemple de critères

Dans Critères, vous n'avez pas besoin de comparer s'il s'agit du premier critère pour ajouter la syntaxe «où», ni formater la date. La ligne de code est réduite et tout est traité de manière plus élégante et orientée objet.

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

API de critères

Laissez-vous guider par certaines fonctions de l'API Criteria.

1. Requête de base sur les critères

Créez un objet critère et récupérez tous les enregistrements ‘StockDailyRecord’ de la base de données.

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

2. Requête de commande de critères

Le résultat est trié par «date» dans l'ordre croissant.

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

Le résultat est trié par «date» dans l'ordre décroissant.

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

3. Requête sur les restrictions de critères

La classe Restrictions fournit de nombreuses méthodes pour effectuer l'opération de comparaison.

Restrictions.eq

Assurez-vous que le valume est égal à 10000.

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

Assurez-vous que le volume est inférieur à 10000.

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

Assurez-vous que le volume est inférieur ou égal à 10000.

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

Assurez-vous que le volume est supérieur à 10000.

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

Assurez-vous que le volume est supérieur ou égal à 10000.

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

Assurez-vous que le nom du titre commence par ‘MKYONG’ et suivez par tous les caractères.

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

Assurez-vous que la date se situe entre la date de début et la date de fin.

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

Assurez-vous que le volume est nul.

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

Assurez-vous que le volume n'est pas nul.

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

De nombreuses autres fonctions de restrictions peuvent être trouvées ici.
https://www.hibernate.org/hib_docs/v3/api/org/hibernate/criterion/Restrictions.html

3. Critères de pagination du résultat

Les critères fournissent peu de fonctions pour rendre la pagination extrêmement facile. À partir du 20e enregistrement, et récupérer les 10 prochains enregistrements de la base de données.

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

Pourquoi pas des critères!?

L'API Criteria présente certains inconvénients.

1. Problème de performance

Vous n'avez aucun moyen de contrôler la requête SQL générée par Hibernate, si la requête générée est lente, vous êtes très difficile à régler la requête et votre administrateur de base de données peut ne pas l'aimer.

1. Problème de maintenance

Toutes les requêtes SQL sont dispersées dans le code Java, lorsqu'une requête a mal tourné, vous pouvez passer du temps à trouver la requête problématique dans votre application. D'autre part, les requêtes nommées stockées dans les fichiers de mappage Hibernate sont beaucoup plus faciles à gérer.

Conclusion

Rien n'est parfait, tenez compte des besoins de votre projet et utilisez-le judicieusement.