Tengo una consulta mediante una combinación y ORDEN y quiero usarlo en mi repositorio usando la Api de Criterios.

Aquí he encontrado, cómo envolver una consulta en un CriteriaQuery (Enlace).

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
Join<Pet, Owner> owner = cq.join(Pet_.owners);
cq.select(pet);
cq.orderBy(cb.asc(owner.get(Owner_.lastName),owner.get(Owner_.firstName)));

Por otro lado, he encontrado algunos ejemplos de uso de la Api de Criterios en Combinación con un JpaRepository (ejemplo).

El Problema es que todos los métodos en el repositorio de esperar una Especificación:

T findOne(Specification<T> spec);

que es siempre construir como este:

public static Specification<PerfTest> statusSetEqual(final Status... statuses) {
    return new Specification<PerfTest>() {
        @Override

        public Predicate toPredicate(Root<PerfTest> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            return cb.not(root.get("status").in((Object[]) statuses));
        }
    };

}

Por un lado sé cómo crear un CriteriaQuery, y en el otro lado necesito una Especificación que es construir a partir de un Predicado, y no puedo averiguar cómo analizar la CriteriaQuery en una Especificación/Predicado.

OriginalEl autor aschi | 2016-05-13

1 Comentario

  1. 11

    Intentar algo como esto (supuse mascota tiene muchos propietarios):

    public static Specification<Pet> ownerNameEqual(String ownerName) {
            return new Specification<Pet>() {
                @Override
                public Predicate toPredicate(Root<Pet> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                    Join<Pet, Owner> owners = root.join("owners");
                    criteriaQuery.orderBy(criteriaBuilder.desc(root.get("id")));
                    return criteriaBuilder.equal(owners.get("name"), ownerName);
                }
            };
        }

    Esto es sólo un ejemplo de búsqueda de todos los animales de cuyo, al menos, un propietario tiene el nombre igual a ownerName

    Pero se puede añadir un método List<Pet> findByOwnersNameOrderByIdDesc(String ownerName); en su repositorio en su lugar (como un equivalente a la Especificación).

    wow, no me esperaba que esto funcione, porque yo no esperaba que criteriaQuery se utiliza más adelante, pero funciona

    OriginalEl autor Jakub Bibro

Dejar respuesta

Please enter your comment!
Please enter your name here