Tenho uma função no sistema que estou desenvolvendo que retorna uma lista de lotes em que a quantidade do lote seja maior que zero, buscando pelo nome do produto (chave estrangeira). Até esse ponto consegui. Ao fazer a pesquisa ele me retorna todos o lotes daquele produto que digitei o nome.
Porém tenho vários lotes do mesmo produto, queria realizar um filtro para que somente fosse exibido o lote que a validade é a menor entre eles, travando a opção do usuário escolher um lote do produto, sendo que tem outro que a validade é menor e poderia ser liberado logo.
public List<Lote> lotePorNomeMedicamento(String nome) {
Session session = this.manager.unwrap(Session.class);
Criteria criteria = session.createCriteria(Lote.class)
// fazemos uma associação (join) com
//medicamento e nomeamos como "m"
.createAlias("medicamento", "m");
// acessamos o nome do medicamento associado ao pedido pelo alias "m",
// criado anteriormente
criteria.add(Restrictions.ilike("m.nome", nome, MatchMode.ANYWHERE));
// retringir lotes com quantidade zero
criteria.add(Restrictions.gt("quantidade",0));
// restringir lotes para o valor exibido seja o menor do grupo
criteria.add(Restrictions.gt("validade", value))
return criteria.addOrder(Order.asc("lote")).list();
}
Esse é o código pensei em usar o Restrictions.gt na validade, porém o valor dessas validade tem ser a menor entre os três.
Ex:
(Lote - Produto - Validade - Quantidade)
Lote01 - Produto01 - 01/02/2016 - 10
Lote02 - Produto01 - 03/02/2016 - 10
Lote03 - Produto01 - 08/02/2016 - 10
O resultado que seria exibido seria o Lote01 apenas, pois é lote do mesmo produto que a validade é a menor entre eles. Alguma sugestão? E possível fazer isso usando o Criteria?