Spring data JPA Especificaciones – @OneToMany de dependencia

tengo un problema con la obtención de la Lista de la entidad Persona de usar Spring data JPA especificaciones (porque de paginación). Necesito conseguir todas las notas por persona pero la dependencia entre estas dos entidades es en la Persona de lado. No sé cómo crear mi Predicado porque la Nota no contiene ningún atributo relacionado con la Persona.

Yo simplemente no puede obtener la Lista con las Personas getter pero no los puedo usar de esta manera porque necesito los datos devueltos paginado.

@Entity
public class Person implements Serializable {

    @Id
    private Long personId;

    @OneToMany
    @JoinColumn(name = "personId")
    private List<Note> notes;

}

@Entity
public class Note implements Serializable {

    @Id
    private Long noteId;
}

Normalmente, yo iba a escribir algo como esto, pero no tengo un atributo de la persona en la Nota de base de datos y no puede ser reasignado en esta etapa.

public static Specification<Note> notesByPerson(final Long personId) {
        return new Specification<Note>() {
            @Override
            public Predicate toPredicate(final Root<Note> root, final CriteriaQuery<?> query,
                    final CriteriaBuilder builder) {

                final Path<Person> per = root.<Person> get("person");

                return builder.equal(per.<Long> get("personId"), personId);

            }
        };
    }

Gracias,
Zdend

OriginalEl autor Zdend | 2012-08-20

2 Kommentare

  1. 11

    Resuelto..

    public static Specification<Note> notesByPerson(final Long personId) {
            return new Specification<Note>() {
    
                @Override
                public Predicate toPredicate(final Root<Note> noteRoot, final CriteriaQuery<?> query,
                        final CriteriaBuilder cb) {
    
                    final Subquery<Long> personQuery = query.subquery(Long.class);
                    final Root<Person> person = personQuery.from(Person.class);
                    final Join<Person, Note> notes = person.join("notes");
                    personQuery.select(notes.<Long> get("noteId"));
                    personQuery.where(cb.equal(person.<Long> get("personId"), personId));
    
                    return cb.in(noteRoot.get("noteId")).value(personQuery);
                }
            };
        }
    puede usted explicar la solución? (elaborado en los pasos)
    Tiene que haber una mejor manera de complicar con que en la cláusula…. Usted debe considerar la adición de la @ManyToOne Person person; en su Nota de clase, de modo que, a continuación, usted puede hacer una simple Combinación.

    OriginalEl autor Zdend

  2. 1

    No estoy seguro de cómo hacerlo con los Predicados, como yo normalmente no uso, pero en JPQL (o HQL, que es similar), puede hacer algo como esto:

    SELECT Note n FROM Person.notes WHERE XXXX

    Es básicamente lo mismo que hacerlo en SQL

    SELECT n.noteId FROM person as p JOIN persons_notes pn ON pn.person=p.personId JOIN notes as n ON n.noteId=pn.noteId

    Me atrevo a adivinar que el Predicado método tiene capacidades similares como se describió anteriormente.

    Ese es el problema.. no puedo usar la consulta como esta, porque la necesito para ser foliados y nuestra aplicación puede asas únicamente especificaciones como consulta argumento. También, soy nuevo con los Predicados así que no sé lo que son capaces.
    Para la paginación, que tomaría el TypedQuery que se genera, ya sea usando el método anterior, o a través de CriteriaBuilder (leer Predicados), a continuación, llamar setFistResult() a la página*returnCount, y setMaxResults() para returnCount. Si usted necesita un total, creo que la mayoría de la gente simplemente llame a la misma consulta, una vez para obtener los datos, otro para hacer un «count()».

    OriginalEl autor CodeChimp

Kommentieren Sie den Artikel

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

Pruebas en línea