web-dev-qa-db-fra.com

Comment retourner une entité avec des colonnes choisies en utilisant des critères

Je suis vraiment nouveau avec Hibernate. Je veux un List<User> Utilisation de critères hibernés, mais uniquement avec les champs ID utilisateur et nom rempli. Est-ce possible? Quelque chose comme la requête indiquée ci-dessous:

SELECT user.id, user.name FROM user

Salutations.

28
Rodrigo Zero

C'est exactement ce que font les projections pour. Voici un exemple:

  Criteria cr = session.createCriteria(User.class)
    .setProjection(Projections.projectionList()
      .add(Projections.property("id"), "id")
      .add(Projections.property("Name"), "Name"))
    .setResultTransformer(Transformers.aliasToBean(User.class));

  List<User> list = cr.list();

En fait, si vous regardez la documentation de "Propriété paresseuse récupération", ils disent spécifiquement:


"Une autre voie différente (meilleure?) D'éviter les lectures de colonne inutiles, au moins pour que les transactions en lecture seule consiste à utiliser les fonctions de projection des requêtes de HQL ou de critères. Cela évite le traitement de la nécessité d'une solution de byTecode de construction et est certainement une solution préférée."


À propos, il existe une question connexe que vous pourriez également être intéressée par: Query hibernate par exemple et projections

56
Matt Solnit

Je suis vraiment en retard qui répond à cela, mais vous pouvez ajouter un transformateur de résultat personnalisé sur l'objet de requête comme ci-dessous.

Query query = session
        .getNamedQuery(
                "someNamedQueryWhichISHQL")
        .setString("cod", "10")
        .setResultTransformer(new ResultTransformer() {

            public Object transformTuple(Object[] row, String[] arg1) {
                User usr = new User(row[0],row[1]);
                return usr
            }

            public List transformList(List arg0) {

                return arg0;
            }
        });
return query.list();
3
Zeus

Généralement, vous ne voulez pas charger partiellement les propriétés d'un objet. Mais si vous devez, voyez ceci:

http://docs.jboss.org/ibernate/stable/core/manual/en-us/html/performance.html#performance-fetching-lazyProperties

Pour un comportement semblable à un rapport simple, vous pouvez utiliser des requêtes d'entité:

sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class);

http://docs.jboss.org/ibernate/stable/core/manual/en-us/html/QuerySQL.html#d0e176

1
ottodidakt