Estou desenvolvendo um sistema que já está paginado (limit e offset) mas quando determino um limit ele gera um conflito no result_count (no caso é o total de resultados)
Estou utilizando hibernate e criteria, postgres, java ee, tenho uma classe Dao que trata toda conexão com o banco postgres.
Em anexo as classes CondutorDao e o CondutorRest:
public class CondutorDao {
private final EntityManager entityManager;
public CondutorDao() {
entityManager = JPAUtil.getEntityManagerFactory().createEntityManager();
}
public List<Condutor> Consultar(String sql, int limit, int offset) {
try {
this.entityManager.getTransaction().begin();
TypedQuery<Condutor> query = this.entityManager.createQuery(sql, Condutor.class).setFirstResult(offset)
.setMaxResults(limit);
if (query.getResultList().size() > 0) {
return query.getResultList();
} else {
return null;
}
} catch (Exception ex) {
return null;
}
}
public Long Count(String sql) {
try {
CriteriaBuilder qb = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> cq = qb.createQuery(Long.class);
cq.select(qb.count(cq.from(Condutor.class)));
cq.where(/*your stuff*/);
return entityManager.createQuery(cq).getSingleResult();
} catch (Exception ex) {
return null;
}
}
}
@Path("/condutor")
public class CondutorRest extends ResourceConfig {
public CondutorRest() {
register(ResponseCorsFilter.class);
}
private final CondutorDao repository = new CondutorDao();
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/listaCondutor")
public Response getTitular(@QueryParam("limit") int limit, @QueryParam("offset") int offset) {
List<Condutor> condutor = repository.Consultar("SELECT p FROM Condutor p", limit, offset);
//limit e offset que é utilizado para paginar limita o count que é pra mostrar o total de resultados que existe no banco
if (condutor != null) {
Result resultado = new Result();
repository.Count("SELECT (*) FROM Condutor c");
resultado.type = "success";
resultado.status = 200;
resultado.limit = limit;
resultado.offset = offset;
resultado.result_count = condutor.size();
resultado.results = condutor;
return Response.status(200).entity(resultado).build();
} else {
ResultError error = new ResultError();
error.error_message = "Not Found";
error.type = "Not Found";
Result resultado = new Result();
resultado.type = "error";
resultado.status = 404;
resultado.results = error;
return Response.status(404).entity(resultado).build();
}
}
}