Skip to content

Instantly share code, notes, and snippets.

@danirod
Created July 24, 2023 20:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danirod/a89e66f176db964be9678005f2c1a2b5 to your computer and use it in GitHub Desktop.
Save danirod/a89e66f176db964be9678005f2c1a2b5 to your computer and use it in GitHub Desktop.
Ejemplo completo del código para hablar de filtros de Hibernate en Quarkus. El código está asociado a las notas de capítulo que hay aquí colgadas, https://www.makigas.es/series/acceso-a-datos-con-quarkus/aplicar-filtros-dinamicos, y el vídeo está aquí: https://www.youtube.com/watch?v=iBP2qw2d3tI
package es.danirod.quarkus.bookshelf.genres;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.ParamDef;
import java.util.Objects;
@Entity
@FilterDef(
name = "name.like",
parameters = @ParamDef(name = "name", type = String.class)
)
@Filter(name = "name.like", condition = "LOWER(name) LIKE LOWER(:name)")
public class Genre {
@Id
@GeneratedValue
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Genre{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Genre genre)) return false;
return Objects.equals(id, genre.id) && Objects.equals(name, genre.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
}
package es.danirod.quarkus.bookshelf.genres;
import es.danirod.quarkus.bookshelf.genres.Genre;
import io.quarkus.hibernate.orm.panache.PanacheQuery;
import io.quarkus.hibernate.orm.panache.PanacheRepository;
import io.quarkus.panache.common.Page;
import io.quarkus.panache.common.Sort;
import jakarta.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class GenreRepository implements PanacheRepository<Genre> {
public PanacheQuery<Genre> findPage(int page) {
Page p = new Page(page - 1, 5);
var query = findAll(Sort.descending("id"));
query.page(p);
return query;
}
}
package es.danirod.quarkus.bookshelf.genres;
import es.danirod.quarkus.bookshelf.PaginatedResponse;
import io.quarkus.panache.common.Parameters;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.Response;
import java.net.URI;
import java.util.NoSuchElementException;
@Path("/genres")
public class GenreResource {
@Inject
private GenreRepository genres;
@GET
public PaginatedResponse<Genre> list(
@QueryParam("page") @DefaultValue("1") int page,
@QueryParam("q") String q
) {
var query = genres.findPage(page);
if (q != null) {
var nameLike = "%" + q + "%";
query.filter("name.like", Parameters.with("name", nameLike));
}
return new PaginatedResponse<>(query);
}
@POST
@Transactional
public Response create(Genre genre) {
genres.persist(genre);
return Response.created(URI.create("/genres/" + genre.getId())).entity(genre).build();
}
@GET
@Path("{id}")
public Genre get(@PathParam("id") Long id) {
return genres
.findByIdOptional(id)
.orElseThrow(() -> new NoSuchElementException("Genre " + id + " not found"));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment