Hibernate Criterios API – adición de un criterio: la cadena debe estar en la colección de

Tengo a la siguiente entidad objeto de


@Entity
public class Foobar {
    ...
    private List<String> uuids;
    ...
}
 

Ahora me gustaría hacer una consulta de criterios que iba a buscar todos los Foobar pojos cuya uuid lista contiene la cadena «abc123», no estoy seguro de cómo hacer que el criterio adecuado.

OriginalEl autor Kim L | 2010-04-29

7 Kommentare

  1. 7

    Supongo que usted está utilizando una versión de Hibernación que implementa JPA 2.0. He aquí un JPA 2.0 solución que debería funcionar con cualquier aplicación compatible con.

    Por favor, anote uuids con JPA del @ElementCollection anotación. No usar el modo de Hibernación del @CollectionOfElements como se ha mencionado en algunas de las otras contestar a los comentarios. El último tiene una funcionalidad equivalente, pero es ser obsoleto.

    Foobar.java buscará aproximadamente así:

    @Entity
    public class Foobar implements Serializable {
    
        //You might have some other id
        @Id
        private Long id;
    
        @ElementCollection
        private List<String> uuids;
    
        //Getters/Setters, serialVersionUID, ...
    
    }

    He aquí cómo usted puede construir una CriteriaQuery para seleccionar todos los Foobars cuya uuids contienen «abc123».

    public void getFoobars() {
    {
        EntityManager em = ... //EM by injection, EntityManagerFactory, whatever
    
        CriteriaBuilder b = em.getCriteriaBuilder();
        CriteriaQuery<Foobar> cq = b.createQuery(Foobar.class);
        Root<Foobar> foobar = cq.from(Foobar.class);
    
        TypedQuery<Foobar> q = em.createQuery(
                cq.select(foobar)
                  .where(b.isMember("abc123", foobar.<List<String>>get("uuids"))));
    
        for (Foobar f : q.getResultList()) {
            //Do stuff with f, which will have "abc123" in uuids
        }
    }

    He hecho una auto-contenido de la prueba de concepto del programa, mientras que con este juego. No puedo mover ahora. Por favor comente si quieren que el POC empujado a github.

    Probado con hibernate 3.6.7-Final y no funciona (que parece ser un error en hibernación).

    OriginalEl autor Dan LaRocque

  2. 3

    Sé que esto es la vieja pregunta, pero sólo he encontrado con este problema y encontrar la solución.

    Si quieres usar el modo de Hibernación de los Criterios que usted puede unirse a su uuids colección y uso de su propiedad elements para que coincida con los elementos. Igual que:

    session.createCriteria(Foobar.class)
        .createAlias("uuids", "uuids")
        .add(Restrictions.eq("uuids.elements", "MyUUID"))
        .list() 
    También se puede utilizar en lugar de «elementos» de la constante CollectionPropertyNames.COLLECTION_ELEMENTS.

    OriginalEl autor Maciej Dobrowolski

  3. 2

    He encontrado este post de hace un año, y he hecho este método, si puede ayudar a alguien con el mismo problema que tuve hace unas horas.

        Public List<EntityObject> getHasString(String string) {
            return getSession().createCriteria(EntityObject.class)
                                   .add(Restriction.like("property-name", string, MatchMode.ANYWHERE).ignoreCase();
                               .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
                               .list();

    Hizo lo mismo con un grupo de cuerdas demasiado.

        public List<EntityObject> getByStringList(String[] tab) {
            Criterion c = Restrictions.like("property-name", tab[tab.length-1], MatchMode.ANYWHERE).ignoreCase();
            if(tab.length > 1) {
                for(int i=tab.length-2; i >= 0 ; i--) {
                    c = Restrictions.or(Restrictions.like("property-name",tab[i], MatchMode.ANYWHERE).ignoreCase(), c);
                }
            }
            return getSession().createCriteria(EntityObject.class)
                                   .add(c)
                               .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
                               .list();
        }

    Funciona con «o» las declaraciones, pero puede ser fácilmente reemplazado por «y» de las declaraciones.

    OriginalEl autor Christian

  4. 1

    Usted podría utilizar una Consulta como en el ejemplo de abajo, o usted podría convertir esto en un NamedQuery. Por desgracia, no parece ser una manera de hacer esto con los Criterios.

    List<Foobar> result = session
         .createQuery("from Foobar f join f.uuids u where u =: mytest")
         .setString("mytest", "acb123")
         .list();

    OriginalEl autor Rachel

  5. 0

    La solución con el sqlRestriction de jira
    http://opensource.atlassian.com/projects/hibernate/browse/HHH-869
    parecía el mejor camino a seguir para mí, ya que me fuertemente el criterio de uso de la api. Tuve que editar Thierry del código, así que trabajé en mi caso

    Modelo:

    @Entity
    public class PlatformData
    {
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private long iID;
    
      private List<String> iPlatformAbilities = new ArrayList<String>();
    }

    Criterios de la llamada:

    tCriteria.add(Restrictions.sqlRestriction(
            "{alias}.id in (select e.id from platformData e, platformdata_platformabilities v"
              + " where e.id = v.platformdata_id and v.element = ? )", aPlatformAbility.toString(),
            Hibernate.STRING));

    OriginalEl autor Pavel Kotlov

  6. -2

    Para empezar, no creo que Hibernate puede asignar una List<String>. Sin embargo, se puede asignar una lista de otras entidades.

    Así que si el código fue algo como esto:

    @Entity
    public class Foobar {
    
        private List<EntityObject> uuids;
        ...
    }

    Y la EntityObject tiene un String-propiedad denominada str, los criterios que se podría parecer a esto:

    List<Foobar> returns = (List<Foobar>) session
                    .createCriteria.(Foobar.class, "foobars")
                    .createAlias("foobars.uuids", "uuids")
                      .add(Restrictions.like("uuids.str", "%abc123%"))
                    .list();
    No hay ningún problema en el uso de una lista de cadenas, sólo anotar con @CollectionOfElements. Su solución requiere de mí para hacer un extra de clase de entidad, algo que yo tenía la esperanza de evitar con esta pregunta.

    OriginalEl autor Lars Andren

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...