Created
July 24, 2023 20:18
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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