Estoy usando EclipseLink como JPA proveedor.

Quiero hacer una consulta para obtener los me todos los nombres que corresponden a ciertas IDs en línea con uno de los Criterios de la consulta.

Root<UserAccount> root = criteria.from(UserAccount.class);
List<Selection<?>> select = new ArrayList<Selection<?>>();
    for (MyElement element : list) {
   Expression<String> firstName = root.get("firstName");
   Expression<String> lastName = root.get("lastName");
   Expression<Integer> id = root.get("id");
   select.add(criteria
                .multiselect(
                        firstName.alias(element.getId() + "_"
                                + element.getEntity() + "f"),
                        lastName.alias(element.getId() + "_"
                                + element.getEntity() + "l"))
                .where(criteriaBuilder.equal(id, element.getAuthorId()))
                .from(UserAccount.class)
                .alias(element.getId() + "_" + element.getEntity()));
}
criteria.multiselect(select);
TypedQuery<Tuple> q = em.createQuery(criteria);
for (Tuple t : q.getResultList()) {
        for (OverviewEntity element : list) {
 System.out.println("////"
                        + t.get(element.getId().toString() + "_"+element.getEntity()+"f",
                                String.class));

Por element.getId() + "_" + element.getEntity() + "f" tengo la intención de crear un alias.

El problema es que todo lo que veo es null. Por qué? ¿Cómo debo obtener todos estos en una consulta(para que no se convertirá en un tiempo)?

  • ¿Por qué quieres crear (único) alias? Lo del elemento.getEntity()?
  • La idea es que cuando me dan los resultados,quiero saber donde hacer todos los resultados del ajuste. El ID no es suficiente, hay algunos más @Transient(no en la base de datos) de información.
  • Este diseño parece mucho más complicado. Me gustaría escribir una simple consulta a devolver todos los UserAccount registros con un Id en el conjunto dado. El resultList se adjunta a PersistenceContext, y usted será capaz de obtener su Transitoria de la propiedad sin ningún esfuerzo…no hay necesidad de utilizar el alias
  • Tienes razón, podría ser más fácil de conseguir y tener la lista, ordenar todos los problemas por la iteración a través de ella. Pero no se que hacer mi consulta más lento(debido a que tengo toda la entidad, y no sólo esos 3 campos)? Por favor enviar una respuesta, puedo aceptarlo.
InformationsquelleAutor Dragos | 2012-02-08

2 Comentarios

  1. 3

    Como se sugiere en los comentarios, me iría a por una solución más simple como

    List<Integer> myList = ....;  //place here your ids
    TypedQuery<UserAccount> q = em.createQuery("select u from UserAccount u where u.id in (:myList)", UserAccount.class);

    o el equivalente consulta mediante CriteriaBuilder y Metamodelo:

    Root<UserAccount> root = q.from(UserAccount.class);
    Expression<Integer> exp = root.get(UserAccount_.id);
    Predicate predicate = exp.in(myList);
    criteria.where(predicate);

    La resultList devuelto contiene las instancias de entidad que se adjuntan a la PersistenceContext. Esto significa que usted será capaz de obtener la Transient propiedades sin esfuerzo.

    Relativas a las actuaciones, puede haber diferencias notables sólo en situaciones extremas, como cuando el tamaño de la lista devuelta es muy grande, o cuando usted tiene que repetir esta consulta, con una alta frecuencia. Pero esto requiere de un análisis profundo.

  2. 8

    El código parece muy confuso y más complicado.

    La JPQL

    Select u.firstName, u.lastName, u.id from UserAccount u where u.id in (:ids)

    Parecería trabajo,

    De criterios, esto es,

    Root<UserAccount> root = criteria.from(UserAccount.class);
    criteria.multiselect(root.get("firstName"), root.get("lastName"), root.get("id"));
    criteria.where(criteriaBuilder.in(root.get("id"), criteriaBuilder.parameter("ids"));
    • Gracias por el código proporcionado. Aún así, el problema es este: uno element pueden ser de tipo A o de tipo «B». Puedo saber de qué tipo es como este: element.getEntity(). Cuando me dan los resultados, debo saber si la devuelven id y su correspondiente firstName y lastName pertenecen a un A o a un B. ESE es el problema, no solo para obtener las Cadenas de la base de datos.

Dejar respuesta

Please enter your comment!
Please enter your name here