JPA – Realizar una consulta de tipo LIKE utilizando el API Criteria para una entidad con un atributo de tipo Collection

septiembre 1, 2016

Supongamos que tenemos una entidad como la siguiente

@Entity
public class Book {

    @Id
    private String id;

    @ManyToMany
    private Collection<Author> authors;

...

}

y su respectivo autor

@Entity
public class Author{
    @Id
    private Long id;

    @Column(name = "NAME")
    private String name;
...    
}

y necesitamos realizar una consulta para listar los libros cuyo nombre del autor contiene un nombre ingresado por el usuario.
Con SQL la consulta sería algo como

SELECT book.id,
       book.title,
       book.isbn,
       author.name AS author
  FROM books book
       JOIN book_authors ba ON ba.book_id = book.id
       JOIN authors author ON ba.author_id = author.id
 WHERE author.name LIKE '%' || :name || '%'

Para realizar esta consulta en JPA la podemos realizar utilizando el Criteria API de la siguiente manera

public List<Book> search(String author){
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Book> cq = cb.createQuery(Book.class);
    Root<Book> from = cq.from(Book.class);
    ParameterExpression<String> authorParameter = cb.parameter(String.class);
    cq.where(cb.like(from.join("author").get("name"), authorParameter));
    TypedQuery<Book> q = em.createQuery(cq);
    q.setParameter(authorParameter, "%" + author + "%");
    return q.getResultList();
}

La parte importante es la línea

cq.where(cb.like(from.join(“author”).get(“name”), authorParameter));

particularmente el método join de la clase Root

Fuentes:
http://www.objectdb.com/java/jpa/query/criteria#Parameters_in_Criteria_Queries_
http://stackoverflow.com/questions/2883887/in-jpa-2-using-a-criteriaquery-how-to-count-results
http://stackoverflow.com/questions/10708809/how-to-query-for-entities-by-their-collection-value

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: