80 votes

Méthode createCriteria obsolète dans Hibernate 5

Cet appel est obsolète :

session.createCriteria(Bus.class).list();

Dans les fichiers sources, je vois ceci :

/** @deprecated */
@Deprecated
Criteria createCriteria(Class var1);

/** @deprecated */
@Deprecated
Criteria createCriteria(Class var1, String var2);

/** @deprecated */
@Deprecated
Criteria createCriteria(String var1);

/** @deprecated */
@Deprecated
Criteria createCriteria(String var1, String var2);

Mais je n'arrive pas à comprendre quelle méthode je dois utiliser à la place de createCriteria .

2 votes

Hibernation version ????

0 votes

Avez-vous besoin d'une méthode pour répertorier les objets du domaine ? Si oui, essayez Bus.createCriteria()

96voto

DimaSan Points 6296

Vous pouvez utiliser les interfaces suivantes à la place dans Hibernate 5.2 + :

javax.persistence.criteria.CriteriaBuilder
javax.persistence.criteria.CriteriaQuery

// Create CriteriaBuilder
CriteriaBuilder builder = session.getCriteriaBuilder();

// Create CriteriaQuery
CriteriaQuery<YourClass> criteria = builder.createQuery(YourClass.class);

0 votes

Merci de votre attention ! Pouvez-vous me conseiller sur ce qu'il faut faire avec hibernate criteria ici : ((Role) criteria.add(Restrictions.eq("name", name)).uniqueResult()).getId(); ?

5 votes

Vous pouvez utiliser CriteriaQuery<T> where méthode. Plus d'informations ici : docs.oracle.com/cd/E19798-01/821-1841/gjivi/index.html

8 votes

21voto

justMe Points 836

J'avais la méthode suivante, j'ai changé les noms des objets pour des raisons de sécurité :

public List<MyObject> listAllForIds(List<Long> ids) {
    Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(MyObject.class)
            .createAlias("joinObject", "joinObject")
            .add(Restrictions.not(Restrictions.like("name", "string1", MatchMode.END)))
            .add(Restrictions.not(Restrictions.like("name", "string2", MatchMode.END)))
            .add(Restrictions.in("joinObject.id", ids));

    return criteria.list();
}

Changer cela pour utiliser :

javax.persistence.criteria.CriteriaBuilder
javax.persistence.criteria.CriteriaQuery

La requête se présente comme suit :

public List<MyObject> listAllForIds(List<Long> ids) {

    CriteriaBuilder builder = getSessionFactory().getCurrentSession().getCriteriaBuilder();
    CriteriaQuery<MyObject> criteria = builder.createQuery(MyObject.class);
    Root<MyObject> myObjectRoot = criteria.from(MyObject.class);
    Join<MyObject, JoinObject> joinObject = myObjectRoot.join("joinObject");

    Predicate likeRestriction = builder.and(
            builder.notLike( myObjectRoot.get("name"), "%string1"),
            builder.notLike( myObjectRoot.get("name"), "%string2")
    );

    criteria.select(myObjectRoot).where(joinObject.get("id").in(ids), likeRestriction);

    TypedQuery<MyObject> query = getSessionFactory().getCurrentSession().createQuery(criteria);

    return query.getResultList();
}

J'espère que cela aidera quelqu'un d'autre, n'hésitez pas à suggérer des changements pour améliorer le code.

0 votes

Je suis en train de transformer ma session hibernate existante en instances de gestionnaires d'entités JPA et je modifie toutes les requêtes createCriteria en utilisant la réponse suggérée ci-dessus, mais je suis tombé sur un statut comme c.setCacheable(true) et c.setCacheRegion("generalCaache"), où c est l'instance Criteria (précédemment) que j'ai changée maintenant en CriteriaQuery. Quel est l'équivalent dans la méthode CriteriaQuery ?

17voto

STEEL Points 649

Ajout d'une réponse en mars 2018.

Dépendances :

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;

import javax.persistence.criteria.CriteriaQuery;
import java.util.List;

public static List<Contact> fecthAllContacts() {
        Session session = sessionFactory.openSession();

        // create Criteria
        CriteriaQuery<Contact> criteriaQuery = session.getCriteriaBuilder().createQuery(Contact.class);
        criteriaQuery.from(Contact.class);

        List<Contact> contacts = session.createQuery(criteriaQuery).getResultList();
        session.close();

        return contacts;
    }

tandis que le sessionFactory est :

public static SessionFactory buildSessionFactory() {
        final ServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
        return new MetadataSources(registry).buildMetadata().buildSessionFactory();
    }

0voto

Amen Amen Points 7

Essayez ceci :

cr.createCriteria("obj1", "obj1", JoinType.LEFT_OUTER_JOIN);

-3voto

pleft Points 4527

Dans la documentation de l'API :

@ Critères createCriteria(Classe persistentClass) Déclassé. (depuis la version 5.2) pour Session, utiliser les critères JPA Crée une instance de critère pour la classe donnée (entité ou sous-classes/implémenteurs). Paramètres : persistentClass - La classe, qui est une entité, ou qui a des sous-classes/implémenteurs d'entité. Retourne : L'instance de critère pour la manipulation et l'exécution

Il est donc brièvement dit de...

utiliser les critères JPA Créer des critères

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X